快速业务通道

Java多线程编程基础之非线程的方法 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23

Java多线程编程基础之非线程的方法

时间:2010-12-09

[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多线程编程基础之非线程的方法(2)

时间:2010-12-09

这段程序控制不了任何,多个线程之间执行到Object o = new Object();时会 各自产生一个对象然后获取这个对象有监视锁,各自皆大欢喜地执行.

而如果是类的属性:

class Test{   Object o = new Object();   public void test(){   synchornized(o){   //...............   }   } }

所有执行到Test实例的synchornized(o)的线程,只有一个线程可以获取到监 视锁.

有时我们会这样:

public void test(){   synchornized(this){   //...............   }   }

那么所有执行Test实例的线程只能有一个线程执行.而synchornized(o)和 synchornized(this)的范围是不同的,因为执行到Test实例的synchornized(o)的 线程等待时,其它线程可以执行Test实例的synchornized(o1)部分,但多个线程同 时只有一个可以执行Test实例的synchornized(this).]

而对于

synchornized(Test.class){   //...............   }

这样的同步块而言,所有调用Test多个实例的线

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号