[wait(),notify()/notityAll()方法]
关于这两个方法,有很多的内容需要说明.在下面的说明中可能会有很多地方 不能一下子明白,但在看完本节后,即使不能完全明白,你也一定要回过头来记住 下面的两句话:
[wait(),notify()/notityAll()方法是普通对象的方法(Object超类中实现), 而不是线程对象的方法]
[wait(),notify()/notityAll()方法只能在同步方法中调用]
[线程的互斥控制]
多个线程同时操作某一对象时,一个线程对该对象的操作可能会改变其状态, 而该状态会影响另一线程对该对象的真正结果.
这个例子我们在太多的文档中可以看到,就象两个操售票员同时售出同一张票 一样.
1.线程A在数据库中查询存票,发现票C可以卖出 | |
class="left"2.线程A接受用户订票请求,准备出票 . | |
3.这时切换到了线程B执行 | |
4.线程B在数据库中查询存票,发现票C可以卖出 | |
5.线程B将票卖了出去 | |
6.切换到线程A执行,线程A卖了一张已经卖出的票 |
所以需要一种机制来管理这类问题的发生,当某个线程正在执行一个不可分割 的部分时,其它线程不能不能同时执行这一部分.
象这种控制某一时刻只能有一个线程执行某个执行单元的机制就叫互斥控制 或共享互斥(mutual exclusion)
在JAVA中,用synchornized关键字来实现互斥控制(暂时这样认为,JDK1.5已经 发展了新的机制)
[synchornized关键字]
把一个单元声明为synchornized,就可以让在同一时间只有一个线程操作该方 法.
有人说synchornized就是一把锁,事实上它确实存在锁,但是是谁的锁,锁谁, 这是一个非常复杂的问题.
每个对象只有一把监视锁(monitor lock),一次只能被一个线程获取.当一个 线程获取了这一个锁后,其它线程就只能等待这个线程释放锁才能再获取.
那么synchornized关键字到底锁什么?得到了谁的锁?
对于同步块,synchornized获取的是参数中的对象锁:
synchornized(obj){
//...............
}
线程执行到这里时,首先要获取obj这个实例的锁,如果没有获取到线程只能等 待.如果多个线程执行到这里,只能有一个线程获取obj的锁,然后执行{}中的语句 ,所以,obj对象的作用范围不同,控制程序不同.
假如:
public void test(){
Object o = new Object();
synchornized(obj){
//...............
}
}