Cosa succede allo stato e ai metodi di blocco quando un thread acquisisce un blocco?

0

Supponiamo che abbia la seguente classe

class Student{
   void method1(){
     // Do Something
   }
   void method2(){
     // Do Something
   }

}

E l'oggetto di questa classe è usato come monitor in sincronizzazione in qualche parte del codice come

class ProcessingThread implements Runnable {
   void someMethod(){
     synchronized(student){    // student object is used as lock. Thread T1 acquires a lock on student.
       // critical section of code
     }
   }
}

Quando un thread T1 acquisisce un blocco sull'oggetto studente ed entra nella sezione critica del codice, allo stesso tempo può un altro thread T2 eseguire un metodo sull'oggetto studente i.e.

class College{
   void assignTopic(){
      student.method1();   // Thread T2 working on student object when 
                           // Thread T1 has acquired a lock on student
   }
}

Voglio sapere che cosa succede ai metodi / variabili dell'oggetto bloccato quando viene acquisito da un thread?

    
posta Free Coder 04.09.2015 - 13:12
fonte

2 risposte

4

What happens when a thread acquires a lock?

Nessun altro thread può acquisire quel blocco finché non viene rilasciato.

Tieni presente che questo è tutto . Sono interessati solo i metodi chiamati tramite altri thread . Solo gli altri thread che competono per lo stesso blocco sono interessati.

Questo significa che il thread di attesa può fare tutto ciò che vuole, proprio come prima del blocco. Gli altri thread non possono acquisire quel blocco, ma possono fare tutto il resto. Ciò include la mutazione dello stato di student , a meno che i tutti di student's di metodi e campi mutanti siano protetti da lo stesso blocco . Se esiste un metodo di muting che non è synchronized , o sincronizza tramite un blocco diverso, l'oggetto "bloccato" può ancora cambiare in modo imprevedibile.

Per elaborare: come dice la risposta di cricket freak, ottenere un blocco su un oggetto non lo protegge dal cambiare a meno che tutti i possibili utenti si impegnino a ottenere lo stesso blocco prima di cambiarlo . Questo è difficile da applicare perché la maggior parte delle lingue non ha il supporto integrato per le domande sulla mutabilità, ma solo per il blocco. Può anche portare a problemi perché ottenere blocchi multipli può facilmente causare deadlock; hai bisogno di una politica chiara in cui ordinare le serrature e tutti devono seguirle tutte le volte. Di nuovo, è facile sbagliare e poche lingue ti danno il supporto per applicarlo.

Questo è il motivo per cui ragionare sulla sicurezza dei thread è difficile: una singola fenditura nell'armatura annulla completamente tutte le asserzioni di coerenza che si desidera eseguire e la sicurezza del thread non è preservata nella composizione (due componenti che hanno dimostrato di essere thread-safe potrebbe non essere sicuro per i thread se utilizzato insieme, ad esempio perché utilizzano diversi blocchi e non lo stesso).

    
risposta data 04.09.2015 - 13:22
fonte
1

Per garantire la sicurezza entrambi i thread devono andare e acquisire il blocco prima di fare confusione con i dati dello studente.

Se un thread non lo fa, è come se nessuno dei due thread avesse acquisito il blocco.

Parte dell'acquisizione del blocco è in attesa fino a quando nessun altro thread non ha il blocco.

    
risposta data 04.09.2015 - 13:23
fonte

Leggi altre domande sui tag