在其他对象上同步

     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()

结论:通过输出可以看出,俩个方式在同时运行,因此任何一个方法都没有因为对另一个方法的同步而被阻塞。

原文地址:https://www.cnblogs.com/beijingstruggle/p/4999390.html