(35)21.3.6 在其它对象上同步---Java编程思想之并发笔记

来源:互联网 发布:用itunes安装软件 编辑:程序博客网 时间:2024/04/30 12:37
1. synchronized块必须给定一个在其上进行同步的对象,并且最合理的方式是,使用其方法正在调用的当前对象:synchronized(this),在这种方式中,如果获得了synchronized块上的锁,那么该对象其他的synchronized方法和临界区就不能被调用了。因此如果在this上同步,临界区的效果就会直接缩小在同步的范围内。
2.在另一个对象上同步。
    有时候必须在另一个对象上同步,这样做必须确保所有相关的任务都是在同一个对象上同步的。
    下面例子展示了两个任务同时进入同一个对象,只要这个对象上的方法是不同的锁。
3.例1:
 
package jiangning.c21;

class DualSync{
       private Object syObject = new SyncObject();
       public synchronized void f(){//同步对象是DualSync,所以会有一个锁
             for(int i=0; i<5; i++){
                  System. out.println("f()" );
                  Thread. yield();
            }
      }
       public void g(){
             synchronized (syObject ) {//同步对象syObject,使用的是另一个锁。
                   for(int i=0; i<5; i++){
                        System. out.println("g()" );
                        Thread. yield();
                  }
            }
      }
      
}
public class SyncObject {
       public static void main(String[] args) {//创建的main线程用来调用g()
             final DualSync ds = new DualSync();
             new Thread(){//创建的Thread线程调用f()
                   public void run(){
                        ds.f();
                  }
            }.start();
            ds.g();
      }
}

/**
g()
f()
f()
f()
f()
f()
g()
g()
g()
g()
*/
分析:因为锁的不同,所以两个方法可以同时进行,不会出现阻塞的现象。
原创粉丝点击