我是靠谱客的博主 默默过客,最近开发中收集的这篇文章主要介绍(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 在其它对象上同步---Java编程思想之并发笔记所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部