java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java Synchronized和Static Synchronized区别

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()

说下结论:

总结

有如下几点:

  1. 对象锁钥匙只能有一把才能互斥,才能保证共享变量的唯一性
  2. 在静态方法上的锁,和 实例方法上的锁,默认不是同样的,如果同步需要制定两把锁一样。
  3. 关于同一个类的方法上的锁,来自于调用该方法的对象,如果调用该方法的对象是相同的,那么锁必然相同,否则就不相同。比如 new A().x()new A().x(),对象不同,锁不同,如果A的单利的,就能互斥。
  4. 静态方法加锁,能和所有其他静态方法加锁的 进行互斥。
  5. 静态方法加锁,和xx.class 锁效果一样,直接属于类的。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文