标签:
synchronized 块必须给定一个在其上进行同步的对象,并且最合理的方式是,使用其方法正在被调用的当前对象:synchronized(this).
在此种方式中,如果获得了synchronized块上同步锁,那么该对象其他的synchronized方法和临界区就不能被调用。因此,如果再this上同步,
临界区的效果就会直接缩小在同步的范围内。
但有时必须在另一个对象上同步,如果这么做,就必须确保所有相关的任务都是在对象上同步的。例如下面例子俩个任务可以同时进入同一个
对象,只要此对象上的方法在不同的锁上同步即可:
public class DualSynch {
private Object syncObject=new Object();
public synchronized void f(){
for(int i=0;i<5;i++){
System.out.println("f()");
Thread.yield();
}
}
public void g(){
//synchronized(this){
synchronized(syncObject){
for(int i=0;i<5;i++){
System.out.println("g()"); Thread.yield();
}
}
}
public static void main(String[] args) {
DualSynch ds=new DualSynch();
new Thread(){
public void run(){
ds.f();
}
}.start();
ds.g();
}
}
输出如下:
g()
f()
f()
f()
f()
f()
g()
g()
g()
g()
结论:通过输出可以看出,俩个方式在同时运行,因此任何一个方法都没有因为对另一个方法的同步而被阻塞。
标签:
原文地址:http://www.cnblogs.com/beijingstruggle/p/4999390.html