码迷,mamicode.com
首页 > 其他好文 > 详细

在其他对象上同步

时间:2015-11-27 00:44:03      阅读:213      评论:0      收藏:0      [点我收藏+]

标签:

     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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!