Eventuali duplicati:
Java Synchronized Block for .classsincronizzare (questo) vs sincronizzazione (MyClass.class)
Stavo leggendo attraverso un article sulla sincronizzazione. Sono confuso sotto i punti e ho bisogno di ulteriori chiarimenti
1) Per il blocco di sincronizzazione. Come
synchronize(this){
// code
}
differisce da
synchronize(MyClass.class){
//code
}
2) Sincronizzazione metodo istanza significa discussioni dovranno ottenere blocco esclusivo sul esempio, mentre la sincronizzazione metodo statico mezzi a filo dovrà acquisire un blocco su tutta la classe (correggimi se sbaglio). Quindi se una classe ha tre metodi e uno di questi è statico sincronizzato, se un thread acquisisce il lock su quel metodo significa che acquisirà il lock su tutta la classe, quindi vuol dire che anche gli altri due verranno bloccati e nessun altro metodo sarà in grado di accedere a questi due metodi mentre l'intera classe sta avendo il blocco?
solo le vars delle classi statiche saranno bloccate con synchronize (MyClass.class) giusto? – tgkprog
@tgkprog Non si sincronizzano le variabili da sé, si sincronizza l'accesso ad esse (tramite metodi). 'MyClass.class' è solo un oggetto ed è possibile (anche se non riesco a immaginare il caso reale quando sarebbe necessario) per sincronizzare anche i metodi di istanza, ma in generale questo paradigma viene utilizzato con metodi statici. –
hmm pensavo che sincronizzare (MyClass.class) bloccasse solo le variabili statiche dichiarate nella classe. dovrà cercare. Quindi dicendo che se avessi 1.000 istanze della mia classe, ognuna con 100 variabili, sarebbero tutte bloccate? – tgkprog