Java中Synchronized和Static Synchronized的区别及说明
作者:二六八
这篇文章主要介绍了Java中Synchronized和Static Synchronized的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
Synchronized和Static Synchronized的区别
synchronized
是对类的当前实例进行加锁,防止其他线程同时访问该类的该实例的所有synchronized块,注意这里是 “类的当前实例” , 类的两个不同实例就没有这种约束了。
那么 static synchronized
恰好就是要控制类的所有实例的访问了, static synchronized
是限制线程同时访问jvm中该类的所有实例同时访问对应的代码块。
一个日本作者-结成浩的《java多线程设计模式》
一个列子
pulbic class Something(){ public synchronized void isSyncA(){} public synchronized void isSyncB(){} public static synchronized void cSyncA(){} public static synchronized void cSyncB(){}
那么,加入有Something类的两个实例a与b
下列组方法何以被1个以上线程同时访问呢
a. x.isSyncA()与x.isSyncB() b. x.isSyncA()与y.isSyncA() c. x.cSyncA()与y.cSyncB() d. x.isSyncA()与Something.cSyncA()
- a . 都是对同一个实例的synchronized域访问,因此不能被同时访问
- b . 是针对不同实例的,因此可以同时被访问
- c . 因为是
static synchronized
,所以不同实例之间仍然会被限制,相当于Something.isSyncA()
与Something.isSyncB()
了,因此不能被同时访问。 - d . 可以被同时访问的,理由是synchronzied的是实例方法与synchronzied的类方法由于锁定(lock)不同的原因。
说下结论:
- A: synchronized static是某个类的范围,synchronized static cSync{}防止多个线程同时访问这个 类中的synchronized static 方法。它可以对类的所有对象实例起作用。
- B: synchronized 是某实例的范围,synchronized isSync(){}防止多个线程同时访问这个实例中的synchronized 方法。
总结
有如下几点:
- 对象锁钥匙只能有一把才能互斥,才能保证共享变量的唯一性
- 在静态方法上的锁,和 实例方法上的锁,默认不是同样的,如果同步需要制定两把锁一样。
- 关于同一个类的方法上的锁,来自于调用该方法的对象,如果调用该方法的对象是相同的,那么锁必然相同,否则就不相同。比如
new A().x()
和new A().x()
,对象不同,锁不同,如果A的单利的,就能互斥。 - 静态方法加锁,能和所有其他静态方法加锁的 进行互斥。
- 静态方法加锁,和xx.class 锁效果一样,直接属于类的。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。