Java中的synchronized、Object.wait()、Object.notify()/notifyAll()原理
2012-03-03 19:52
483 查看
转载于© 2011 ZeroUp.org
synchronized与互斥锁mutex
synchronized用来锁定某个对象,体现的是标准的互斥锁mutex的机制,synchronized代码块的开始即是lock该mutex,代码块的结束即是unlock。
Object.wait()与条件变量
Object.wait()在使用时通常要判断是否满足某个条件,不满足某个外部条件cond时调用wait(),来让线程阻塞同时释放被synchronized锁定的mutex;从这个过程看来Object.wait()实际上是起到条件变量的作用,wait()内部实际上先将synchronized锁定的锁释放,之后将当前线程阻塞在某个内置的条件condition上(注意:此condition为内置的,与外部判断的条件cond并非同一个,外部的cond需要程序员根据程序逻辑来判断改变,而这个condition只能被Object.notify()/notifyAll()改变),直到内置条件condition被Object.notify()/notifyAll()修改时才会重新锁定该mutex,继续执行wait()后的代码。
Object.notify()/notifyAll()与条件变量
Object.notify()/notifyAll()实际上只起到一个sinal内置条件变量的作用,调用Object.notify()/notifyAll()之后,这个时候其他处于wait()中的线程所等待的内置条件变量已经满足,但是由于wait()中仍然需要lock mutex,而在Object.notify()/notifyAll()中没有把mutex释放掉,故阻塞在wait()处的线程继续等待,但等待的条件不再是内置条件变量而是锁mutex;直到synchronized代码块结束时,由于会自动释放被synchronized锁定的mutex,故此时所有在wait()中等待mutex的线程开始竞争mutex,得到该mutex的会继续执行,否则继续等待mutex。
相关代码
被synchronized锁定的mutex为mutex =obj.mutex;
被wait和notify共享的内置条件变量condition = obj.condition;
总结
在使用synchronized、Object.wait()、Object.notify()/notifyAll()实现线程同步时,用到了两种机制:线程互斥锁mutex和条件变量condition。
相关文章推荐
- Java中的synchronized、Object.wait()、Object.notify()/notifyAll()原理
- Java中的synchronized、Object.wait()、Object.notify()/notifyAll()原理
- Java中的synchronized、Object.wait()、Object.notify()/notifyAll()原理
- Java中的synchronized、Object.wait()、Object.notify()/notifyAll()的使用
- java多线程设计wait、notify、notifyall、synchronized的使用机制
- [JAVA] java多线程设计wait、notify、notifyall、synchronized的使用机制
- 关于java中的synchronized、wait以及notify和notifyAll
- java线程同步(synchronized,wait,notify,notifyAll)
- Java 并发编程 一 Object的wait(),notify(),notifyAll()
- java wait() notify() notifyAll() synchronized关键字总结
- java.lang.Object 的 wait 和 notify方法,及关键字 synchronized的作用
- java Object 对象的的wait()、notify()、notifyAll()介绍
- Java_Object_wait()、notify()、notifyAll()
- java多线程设计wait、notify、notifyall、synchronized的使用机制
- JAVA 线程状态以及synchronized,wait,sleep,yield,notify,notifyAll
- 【Java基础之Object类(二)、线程同步(一)】Java中使用Object类的wait,notify,notifyAll做线程调度
- Java中级----多线程同步基本思想,java多线程设计wait、notify、notifyall、synchronized的使用机制(转)
- Java并发07:Thread的基本方法(4)-Thread.sleep()、Object.wait()、notify()和notifyAll()
- 【Java并发系列02】Object的wait()、notify()、notifyAll()方法使用
- JAVA 线程状态以及synchronized,wait,sleep,yield,notify,notifyAll