类的每个实例都有自己的对象级别锁,例如当创建了一个类的两个不同对象(obj1->thread1,obj2-)thread2)时,尽管调用的时synchronized的方法,但不存在排斥访问对象级别锁。当thread1进入该方法是获得排斥性访问obj1的对象级别锁的权限,同理,thread2进入该方法是获得反问obj2的对象级别锁的权限! 不明白的是: public synchronized String getNames() { 当Threa1在执行方法setNamee(..)时,Thread2为什么受到阻塞阿? 如果两个或者多个线程同时与某个对象的成员变量交互,而且至少有一个线程会更改他的直,则一般来说,理想的做法是使用synchronized来控制并发访问。如果只有一个线程访问对象,那就没有必要了使用synchronized,这样反而减缓了他的执行速度! 当整个方法不需要同步,或者希望thread获得不同对象上的对象级别锁时可以使用(synchronized block) sychronized (obj){ ....} obi 是对性的引用],必须进入代码段之前获得对象的级别锁! for example public synchronized void setPoint(int x,int y){ this.x =x; this.y =y; } 使用同步块: public void setPoint(int x,int y){ synchronized(this){ this.x =x;
this.y =y;
return lname + ", " + fname;
}
public synchronized void setNames(
String firstName,
String lastName
) {
两个版本几乎相同,但是都确保在修改,xy之前获得实例的对象级别锁的排斥访问权限!
synchronized语句还可以使用类的级别锁,可以确保一个thread对两个static的方法调用不会与另一个thread的调用交织在一起!
synchronized (className.class){
//....}
实际使用时将类的名字替换其中的className.
正文
Thread中的synchronized2006-04-13 09:18:00
【评论】 【打印】 【字体:大 中 小】 本文链接:http://blog.pfan.cn/yexin218/12339.html
阅读(3759) | 评论(0)
版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!
评论