Der Unterschied zwischen synchronisiert und statisch synchronisiert in JAVA

Der Unterschied zwischen synchronisiert und statisch synchronisiert in JAVA

IT IT haha

1. Der Unterschied zwischen synchronisiert und statisch synchronisiert

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

Hier ist es klar, dass Sie beurteilen können:
a, sind alle Zugriffe auf die synchronisierte Domäne derselben Instanz, so dass nicht gleichzeitig auf sie zugegriffen werden kann. B ist für verschiedene Instanzen, so dass auf sie gleichzeitig zugegriffen werden kann. C. Da es sich um statisch synchronisierte, verschiedene Instanzen von handelt Die Zeit wird weiterhin eingeschränkt, was Something.isSyncA () und Something.isSyncB () entspricht, sodass nicht gleichzeitig auf sie zugegriffen werden kann. Was ist also mit d? Auf die Antwort im Buch kann gleichzeitig zugegriffen werden. Der Grund für die Antwort ist, dass sich die Instanzmethode für die Synchronisierung aufgrund der unterschiedlichen Gründe für die Sperre von der Klassenmethode für die Synchronisierung unterscheidet. Persönliche Analyse bedeutet, dass synchronisiert und statisch synchronisiert zwei Banden entsprechen, von denen jede ihre eigenen verwaltet, keine Einschränkungen bestehen und gleichzeitig zugegriffen werden kann. Es ist noch nicht klar, wie das interne Design von in Java synchronisiert realisiert wird.

Schlussfolgerung: A: Synchronisierte Statik ist der Bereich einer bestimmten Klasse. Synchronisierte statische cSync {} verhindert, dass mehrere Threads gleichzeitig auf synchronisierte statische Methoden in dieser Klasse zugreifen. Es kann auf alle Objektinstanzen der Klasse einwirken.
B: synchronisiert ist der Bereich einer Instanz, synchronisiert isSync () {} verhindert, dass mehrere Threads in dieser Instanz gleichzeitig auf die synchronisierte Methode zugreifen.

2. Der Unterschied zwischen synchronisierter Methode und synchronisiertem Code schnell

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

3. Das synchronisierte Schlüsselwort kann nicht vererbt werden

     这个在《搞懂java中的synchronized关键字》一文中看到的,我想这一点也是很值得注意的,继承时子类的覆盖方法必须显示定义成synchronized。(但是如果使用继承开发环境的话,会默认加上synchronized关键字)

Ich denke du magst

Origin blog.51cto.com/15061944/2593721
Empfohlen
Rangfolge