Thread中的synchronized
类的每个实例都有自己的对象级别锁,例如当创建了一个类的两个不同对象(obj1->thread1,obj2-)thread2)时,尽管调用的时synchronized的方法,但不存在排斥访问对象级别锁。当thread1进入该方法是获得排斥性访问obj1的对象级别锁的权限,同理,thread2进入该方法是获得反问obj2的对象级别锁的权限!
不明白的是:
public synchronized String getNames() {
return lname + ", " + fname;
}
public synchronized void setNames(
String firstName,
String lastName
) {
当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;
}
//广州达内www.gztarena.com
两个版本几乎相同,但是都确保在修改,xy之前获得实例的对象级别锁的排斥访问权限!
synchronized语句还可以使用类的级别锁,可以确保一个thread对两个static的方法调用不会与另一个thread的调用交织在一起!
synchronized (className.class){
//....}
实际使用时将类的名字替换其中的className.