synchronized 与 static synchronized 的区别

synchronized 与 static synchronized 的区别

synchronized 是对类的当前实例进行加锁,防止其他线程同时访问该类的该实例的所有 synchronized 块,注意这里是 “类的当前实例”, 类的两个不同实例就没有这种约束了。那么 static synchronized 恰好就是要控制类的所有实例的访问了,static synchronized 是限制线程同时访问 jvm 中该类的所有实例同时访问对应的代码快。实际上,在类中某方法或某代码块中有 synchronized,那么在生成一个该类实例后,改类也就有一个监视快,放置线程并发访问改实例 synchronized 保护快,而 static synchronized 则是所有该类的实例公用一个监视快了,也也就是两个的区别了,也就是 synchronized 相当于 this.synchronized,而 static synchronized 相当于 Something.synchronized. 一个日本作者 – 结成浩的《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)不同的原因。 个人分析也就是 synchronized 与 static synchronized 相当于两帮派,各自管各自,相互之间就无约束了,可以被同时访问。目前还不是分清楚 java 内部设计 synchronzied 是怎么样实现的。 结论:A: synchronized static 是某个类的范围,synchronized static cSync {} 防止多个线程同时访问这个 类中的 synchronized static 方法。它可以对类的所有对象实例起作用。 B: synchronized 是某实例的范围,synchronized isSync (){} 防止多个线程同时访问这个实例中的 synchronized 方法。

synchronized 方法与 synchronized 代码快的区别

synchronized methods (){} 与 synchronized(this){} 之间没有什么区别,只是 synchronized methods (){} 便于阅读理解,而 synchronized(this){} 可以更精确的控制冲突限制访问区域,有时候表现更高效率。

synchronized 关键字是不能继承的

这个在 http://www.learndiary.com/archives/diaries/2910.htm 一文中看到的,我想这一点也是很值得注意的,继承时子类的覆盖方法必须显示定义成 synchronized