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
分享到:
相关推荐
java中synchronized用法
java里面synchronized用法
java同步synchronized关键字用法示例
java多线程编程核心技术synchronized实例大全,同步方法,同步语句块,类锁,对象锁全都用代码来展现出来
synchronized关键字在java中的重要性 以及常用的方法 还有它的详解
Synchronized关键字的用法
java多线程中synchronized关键字的用法 解压密码 www.jiangyea.com
java锁机制Synchronized java锁机制Synchronized java锁机制Synchronized java锁机制Synchronized
synchronized是很重要的,但是不少人不是很明白synchronized的用法,这里有详细的doc文档给大家参考
你还在用synchronized?线程安全相关知识深入剖析
Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。本文给大家介绍java中 synchronized的用法,对本文感兴趣的朋友一起看看吧
java synchronized的一些小实验,对帮助理解synchronized的使用有一定的帮助。
主要介绍了PHP pthreads v3下同步处理synchronized用法,结合实例形式分析了PHP pthreads v3下同步处理synchronized原理、使用方法及相关操作注意事项,需要的朋友可以参考下
NULL 博文链接:https://seandsky-boyy-163-com.iteye.com/blog/1340783
synchronized下的方法控制多线程程序中的线程同步非常方便,这里就来看一下Java使用synchronized修饰方法来同步线程的实例演示,需要的朋友可以参考下
synchronized的几种示例研究,方法加锁,代码块加锁(this和对象)以及静态方法加锁的示例和效果。基本上包含了synchronized的几种常用的方式。
synchronized 测试案例,同步一个对象或者多个对象的案例均有,还有成功和失败案例的对比
volatile与synchronized的区别,锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility)
主要介绍了Java中syncronized正确使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下