黑马程序员——线程中等待唤醒机制及jdk5版本lock的深入思考
来源:互联网 发布:抑郁和悲伤的区别 知乎 编辑:程序博客网 时间:2024/05/20 13:16
------- android培训、java培训、期待与您交流! ----------
通过前几天的学习,对唤醒机制中的wait()方法一直有点困惑。先看两段段简单的代码片段:
synchronized(s){if(!s.flag)try{s.wait();}catch (Exception e){}if(x==0){s.name="张三";s.sex="男";x=1;}else{s.name="李思";s.sex="女";x=0;}s.flag=false;s.notify();}
下一段:
synchronized(s){if(s.flag)try{s.wait();}catch (Exception e){}System.out.println("姓名:"+s.name+"……性别:"+s.sex);s.flag=true;s.notify();}
关于同步代码块的使用,jdk1.5及以后版本做了很好的改进,那就是使用lock()。 有个生产消费的例子,先使用synchronized,代码如下所示:
class ProductDemo {public static void main(String[] args) {Src s = new Src();Produce pro = new Produce(s);consume con = new consume(s);Thread t1 = new Thread(pro);Thread t2 = new Thread(con);Thread t3 = new Thread(pro);Thread t4 = new Thread(con);t1.start();t2.start();t3.start();t4.start();}}class Src {private String name;private int index = 0;public boolean flag = false;public void set(String name) {this.name = name;System.out.println(name + "-----" + (++index) + "----被生产");}public void get() {System.out.println(name + "-----" + index + "----------被消费");}}class Produce implements Runnable {private Src s;Produce(Src s) {this.s = s;}public void run() {while (true) {synchronized (s) {while (s.flag)try {s.wait();} catch (Exception e) {}s.set("商品");s.flag = true;s.notifyAll();}}}}class consume implements Runnable {private Src s;consume(Src s) {this.s = s;}public void run() {while (true) {synchronized (s) {while (!s.flag)try {s.wait();} catch (Exception e) {}s.get();s.flag = false;s.notifyAll();}}}}
用lock来写如下:
import java.util.concurrent.locks.*;class ProductLockDemo {public static void main(String[] args) {Src s = new Src();Produce pro = new Produce(s);consume con = new consume(s);Thread t1 = new Thread(pro);Thread t2 = new Thread(con);Thread t3 = new Thread(pro);Thread t4 = new Thread(con);t1.start();t2.start();t3.start();t4.start();}}class Src {private String name;private int index = 0;public boolean flag = false;Lock lock = new ReentrantLock();Condition condition_pro = lock.newCondition();Condition condition_con = lock.newCondition();public void set(String name) {this.name = name;System.out.println(name + "-----" + (++index) + "----被生产");}public void get() {System.out.println(name + "-----" + index + "----------被消费");}}class Produce implements Runnable {private Src s;Produce(Src s) {this.s = s;}public void run() {while (true) {s.lock.lock();try {while (s.flag) {s.condition_pro.await();}s.set("商品");s.flag = true;s.condition_con.signal();} catch (Exception e) {} finally {s.lock.unlock();}}}}class consume implements Runnable {private Src s;consume(Src s) {this.s = s;}public void run() {while (true) {s.lock.lock();try {while (!s.flag)try {s.condition_con.await();} catch (Exception e) {}s.get();s.flag = false;s.condition_pro.signal();} finally {s.lock.unlock();}}}}
- 黑马程序员——线程中等待唤醒机制及jdk5版本lock的深入思考
- juc包中等待唤醒机制实现
- 黑马程序员——线程间通信_等待唤醒机制
- 黑马程序员—多线程(下)--多线程安全问题及唤醒等待机制
- 黑马程序员 线程通讯——唤醒的线程需要再次进行标记值判断
- 黑马程序员java学习—多线程2:等待唤醒机制
- 黑马程序员——线程及通信机制
- 黑马程序员------线程2(小结)-等待唤醒机制
- 黑马程序员——枚举(JDK5的新特性)
- 黑马程序员——Java基础——多线程的同步、死锁和等待唤醒机制
- 黑马程序员--等待唤醒机制
- 黑马程序员——Java多线程线程间通信之Lock的应用
- 黑马程序员 多线程的等待唤醒机制的理
- 黑马程序员_多线程的死锁和等待唤醒机制
- 黑马程序员--线程之间的通信,等待与唤醒机制,线程的终止方式,线程中的其他方法,优先级,toString() 守护线程,GUI图形化界面
- 黑马程序员—反射的机制及应用1
- 黑马程序员——线程的生命周期及常用方法
- 黑马程序员---深入线程
- 黑马程序员——java多线中的死锁问题
- java中的集合框架
- C#复制、粘贴文本信息到剪贴板
- 黑马程序员——java中两个线程对同一个数据做不同操作的安全问题
- 堆 与 栈
- 黑马程序员——线程中等待唤醒机制及jdk5版本lock的深入思考
- 2013年 最新面试题
- BaseServlet
- iOS中Http(面试时讲述步骤)
- 黑马程序员——看JDK API 1.6.0中文版研究String的用法
- HttpSessionAttributeListener的例子
- Qt汉化和中文乱码解决
- OpenRisc-2-C to Verilog
- 黑马程序员——FileWriter和FileReader的基本用法