Se il tuo codice si trova in un processo che ha più thread in esecuzione contemporaneamente, potrebbe essere in esecuzione contemporaneamente. Se il risultato di ogni esecuzione è lo stesso di un singolo thread e i valori delle altre variabili sono gli stessi come previsto, è thread safe. In altre parole, l'interfaccia fornita da una classe o programma è atomica per i thread o il passaggio tra più thread non porta a ambiguità nel risultato di esecuzione dell'interfaccia, il che significa che non è necessario considerare la sincronizzazione. I problemi di sicurezza del thread sono causati sia da variabili globali che statiche. Se ogni thread ha solo operazioni di lettura per variabili globali e statiche, ma nessuna operazione di scrittura, generalmente questa variabile globale è thread-safe; Se più thread eseguono operazioni di lettura e scrittura su una variabile contemporaneamente, generalmente è necessaria la sincronizzazione dei thread, altrimenti potrebbe influire sulla sicurezza dei thread.
Lo scopo del lock è prevenire operazioni concorrenti quando l'esecuzione multithread è attiva, e gli oggetti del tipo di lock di riferimento permettono di operare solo un thread alla volta nella sua area bloccata.
Il lock può bloccare solo una variabile di tipo di riferimento, cioè bloccare un indirizzo
C'è una differenza tra i risultati di esecuzione con e senza bloccaggio:
Dopo il blocco: il valore di i diminuirà uno dopo l'altro, non ci saranno salti, né output ripetuti, fino al valore di 0;
Nessun blocco: il valore in uscita di i salta, decrescente discontinua e può avere anche un'uscita di -1;
Motivo: Dopo aver aggiunto un lock, solo un thread può eseguire il codice nell'area bloccata alla volta, e entrambi i thread vengono eseguiti in ordine, quindi non ci sarà alcun output interrotto. |