JAVAでの同期同期と静的同期の違い
ITITハハ
1.同期同期と静的同期の違い
synchronized是对类的当前实例进行加锁,防止其他线程同时访问该类的该实例的所有synchronized块,注意这里是“类的当前实例”, 类的两个不同实例就没有这种约束了。那么static synchronized恰好就是要控制类的所有实例的访问了,static synchronized是限制线程同时访问jvm中该类的所有实例同时访问对应的代码快。实际上,在类中某方法或某代码块中有 synchronized,那么在生成一个该类实例后,改类也就有一个监视快,放置线程并发访问改实例synchronized保护快,而static synchronized则是所有该类的实例公用一个监视快了,也也就是两个的区别了,也就是synchronized相当于 this.synchronized,而static synchronized相当于Something.synchronized.
一个日本作者-结成浩的《java多线程设计模式》有这样的一个列子:
pulbic class Something(){
publicsynchronizedvoid isSyncA(){}
publicsynchronizedvoid isSyncB(){}
publicstaticsynchronizedvoid cSyncA(){}
publicstaticsynchronizedvoid 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、同じインスタンスの同期されたドメインへのすべてのアクセスであるため、同時にアクセスすることはできません。bは異なるインスタンス用であるため、同時にアクセスできます。c。静的に同期されているため、時間は引き続き制限されます。これはSomething.isSyncA()およびSomething.isSyncB()と同等であるため、同時にアクセスすることはできません。では、dはどうですか?本の中の答えに同時にアクセスできます。答えの理由は、ロックの理由が異なるため、同期のインスタンスメソッドが同期のクラスメソッドと異なるためです。個人分析とは、同期同期と静的同期は2つのギャングに相当し、それぞれが独自に管理し、相互に制限がなく、同時にアクセスできることを意味します。javaで同期された内部設計がどのように実現されるかはまだ明らかではありません。
結論:A:同期静的は特定のクラスのスコープです。同期静的cSync {}は、複数のスレッドがこのクラスの同期静的メソッドに同時にアクセスするのを防ぎます。クラスのすべてのオブジェクトインスタンスに作用できます。
B:同期はインスタンスのスコープです。同期されたisSync(){}は、複数のスレッドがこのインスタンスの同期されたメソッドに同時にアクセスするのを防ぎます。
2.同期方式と同期コードの高速の違い
synchronized methods(){} 与synchronized(this){}之间没有什么区别,只是synchronized methods(){} 便于阅读理解,而synchronized(this){}可以更精确的控制冲突限制访问区域,有时候表现更高效率。
3.同期されたキーワードは継承できません
这个在《搞懂java中的synchronized关键字》一文中看到的,我想这一点也是很值得注意的,继承时子类的覆盖方法必须显示定义成synchronized。(但是如果使用继承开发环境的话,会默认加上synchronized关键字)