在其他对象上同步

 Synchronized标记的代码必须给顶一个其上进行同步的对象,并且最合理的方式是,使用其方法正在调用的对象Synchronized(this)这是最常用的方式了,在这种方式中 如果获得了Synchronized块上的锁,那么该对象其他的Synchronized方法和临界区就不能调用了。所以有时候需要我们在另一个对象上同步,然后我们必须保证所有相关的任务都是在同一个对象上同步的,然后写了一个实例 演示两个人物可以同时进入一个对象,只要这个对象上的方法是在不同的锁上同步即可

package test.thread.sx.other;

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 (syncObject) {
            for(int i=0;i<5;i++){
                System.out.println("g()");
                Thread.yield();
            }
        }
    }
    


package test.thread.sx.other;

public class SyncObject {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
     final DualSynch ds = new DualSynch();
     new Thread(){
         public void run(){
             ds.f();
         }
         
     }.start();
     ds.g();
    }

}

结果是 互相不影响  线程不会发生锁定

g()
f()
g()
g()
g()
g()
f()
f()
f()
f()

 

posted @ 2017-11-24 14:54  陈东的博客  阅读(192)  评论(0编辑  收藏  举报