我是靠谱客的博主 默默过客,这篇文章主要介绍(35)21.3.6 在其它对象上同步---Java编程思想之并发笔记,现在分享给大家,希望可以做个参考。

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()
*/
分析:因为锁的不同,所以两个方法可以同时进行,不会出现阻塞的现象。

最后

以上就是默默过客最近收集整理的关于(35)21.3.6 在其它对象上同步---Java编程思想之并发笔记的全部内容,更多相关(35)21.3.6内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部