La diferencia entre sincronizado y sincronizado estático en JAVA

La diferencia entre sincronizado y sincronizado estático en JAVA

Es jaja

1. La diferencia entre sincronizado y sincronizado estático

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

Aquí, está claro que puede juzgar:
a, son todos los accesos al dominio sincronizado de la misma instancia, por lo que no se puede acceder a ellos al mismo tiempo. B es para diferentes instancias, por lo que se puede acceder a ellos al mismo tiempo c. Debido a que es estático sincronizado, diferentes instancias de El tiempo seguirá estando restringido, lo que equivale a Something.isSyncA () y Something.isSyncB (), por lo que no se puede acceder a ellos al mismo tiempo. Entonces, ¿qué pasa con d? Se puede acceder a la respuesta en el libro al mismo tiempo. La razón de la respuesta es que el método de instancia de sincronizado es diferente del método de clase de sincronizado debido a las diferentes razones de bloqueo. El análisis personal significa que sincronizado y sincronizado estático equivalen a dos pandillas, cada una gestiona la suya, no hay restricciones entre sí y se puede acceder al mismo tiempo. Todavía no está claro cómo se realiza el diseño interno de sincronizado en java.

Conclusión: A: la estática sincronizada es el alcance de una determinada clase, la estática sincronizada cSync {} evita que varios subprocesos accedan simultáneamente a métodos estáticos sincronizados en esta clase. Puede actuar sobre todas las instancias de objeto de la clase.
B: sincronizado es el alcance de una instancia, sincronizado isSync () {} evita que varios subprocesos accedan simultáneamente al método sincronizado en esta instancia.

2. La diferencia entre el método sincronizado y el código sincronizado rápido

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

3. La palabra clave sincronizada no se puede heredar

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

Supongo que te gusta

Origin blog.51cto.com/15061944/2593721
Recomendado
Clasificación