Java多线程编程底子之非线程的办法[Java编程]
本文“Java多线程编程底子之非线程的办法[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
[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){
//...............
}
}
以上是“Java多线程编程底子之非线程的办法[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |