`
thecloud
  • 浏览: 881463 次
文章分类
社区版块
存档分类
最新评论

synchronized用法探究

 
阅读更多

synchronized中文为同步,所谓同步,即是和异步所相对的,同步和异步的概念在多线程和网络通信中有较为广泛的应用。个人觉得同步表示就是多个线程相互之间有规律的进行,而异步则是相互之间没有关系。既然synchronized表示同步,则能够很好的协同各个线程执行。

在java中,当一个代码块被加上synchronized关键字,这部分同步代码就好像是一个见到兵符才听令的军队,而这里的兵符则是一个指定的同步对象。当一个线程运行到同步代码时,可以获得这个被认作是兵符的同步对象,并对这个兵符上了锁,这时当其他线程想调用这个军队时,则需要等之前那个线程释放对兵符的锁,它才可以获得兵符,并再次将这个兵符上锁,调用这个军队。

第一种用法:

synchronized(同步对象) {

  //同步代码

}

这里的同步对象可以是任何一个对象,只有获得这个同步对象的锁才可以运行同步代码,这里如果多个线程同时运行这一部分代码,且同步对象是同一个对象,则需要依次进行,不可以并发进行,这样保证了同步代码的操作完整性。

第二种用法:

public synchronized void method(){

//同步代码

}

这里将一个方法进行同步,实际上,它的效果等同于

public void method(){

synchronized(this) {

   //同步代码

}

}

这里的this指的是这个方法所在的对象。

如果这里的方法是static的话,即:

public synchronized static void method(){

//同步代码

}

转化成

public staticvoid method(){

synchronized(this) {

   //同步代码

}

}

这里的this指的就是这个方法所在的类的.Class对象。

具体到应用比较复杂,举两个例子:
1:


2:


两个例子中,都有一段synchronized的代码。
在1中,main方法中创建的10个线程 不能同时进入到那段代码执行,因为这10个线程需要让
同一个object授权

在2中,main方法中创建的10个线程 可以同时进入到那段代码执行,因为10个线程是让不同
的object授权的,均授权成功,同时进入到那段代码执行

使用同步机制时的注意点:

1.在使用并发时,将域设置为private是非常重要的,否则,synchronized关键字就不能防止其他任务直接访问域,这样会发生冲突。

2.什么时候应该使用同步呢?Brain同步规则:如果你正在写一个变量,它可能接下来将被另一个线程读取,或者正在读取一个上一次已经被另一个线程写过的变量,那么你必须使用同步,并且读写线程都必须用相同的监视器锁同步。

3.有时候会用到显示的Lock对象进行处理,因为有了Lock对象,你就可以使用finally子句将系统维护在正确的状态。不会造成死锁的情况。

参考文献

1. 《Thinking in java》

2. java synchronized 用法http://www.cneln.com/club/index/content_fabu.php?book_id=317&id=5446

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics