如下代码:
public class SyncClass{
public static object lockObje = new object()
synchronized void syncMethod1(){}
synchronized void syncMethod2(){}
void syncMethod3(){synchronized(this)}
void syncMethod4(){synchronized(obj){}}
synchronized static void syncMethod5(){}
synchronized Static void syncMethod6(){}
}
同一实例a = new SyncClass()
1.a.syncMethod1(),a.syncMethod2()不能并发执行,a.syncMethod3()中的函数体不能和前两个并发执行。此时,执行三个函数,当需要获得lock时,它们需要的锁是同一个,就是a这个object;
2.前三个和a.syncMethod4(),a.syncMethod5()或者a.syncMethod6()可并发执行,a.syncMethod4()请求的锁是obj,a.syncMethod5或者a.syncMethod6()请求的锁是SyncClass(java.lang.object.class)
3.a.syncMethod5()或者a.syncMethod6()不能并发执行,因为它们请求的锁都是SyncClass(java.lang.object.class)
不同实例a = new SyncClass();b = new SyncClass()
1.a.syncMethod1()和b.syncMethod1()可并发执行,请求的锁对象不同,一个为a,另一个是b
2.a.syncMethod5()和b.syncMethod5()不能并发,因为请求的锁均为SyncClass(java.lang.object.class).
synchronized 用在不同的地方,是否能够同步要看请求的锁引用是否相同
update 2011年2月2日
如有synchronized(SyncClass.lockObjec) ,则请求的锁同是SyncClass(java.lang.object.class)??,有待确认
如有synchronized(a.lockObject)和synchronized(b.lockObject),则请求锁相同,只能有一个可以执行