Se un metodo accede solo alle variabili locali, è thread-safe. È così?
Assolutamente no. È possibile scrivere un programma con una sola variabile locale a cui si accede da un singolo thread che tuttavia non è thread-safe:
https://stackoverflow.com/a/8883117/88656
Questo vale anche per i metodi statici?
Assolutamente no.
Una risposta, fornita da @Cybis, è stata: "Le variabili locali non possono essere condivise tra i thread perché ogni thread ottiene il proprio stack".
Assolutamente no. La caratteristica distintiva di una variabile locale è che è visibile solo dall'ambito locale , non che è allocata nel pool temporaneo . È perfettamente legale e possibile accedere alla stessa variabile locale da due thread diversi. Puoi farlo usando metodi anonimi, lambda, blocchi iteratori o metodi asincroni.
È il caso anche dei metodi statici?
Assolutamente no.
Se un metodo viene passato a un oggetto di riferimento, ciò rompe la sicurezza del thread?
Può essere.
Ho fatto alcune ricerche e ci sono molte cose su alcuni casi, ma speravo di essere in grado di definire, usando solo alcune regole, le linee guida da seguire per assicurarsi che un metodo sia sicuro per i thread.
Dovrai imparare a vivere con delusione. Questo è un argomento molto difficile.
Quindi, immagino che la mia ultima domanda sia: "Esiste un breve elenco di regole che definiscono un metodo thread-safe?
No. Come hai visto dal mio esempio in precedenza, un metodo vuoto può essere non thread-safe . Potresti anche chiedere "c'è un breve elenco di regole che garantisce che un metodo sia corretto ". No non c'è. La sicurezza del filo non è altro che un tipo estremamente complicato di correttezza.
Inoltre, il fatto che tu stia ponendo la domanda indica il tuo fondamentale fraintendimento sulla sicurezza del thread. La sicurezza del thread è una proprietà globale , non locale di un programma. Il motivo per cui è così difficile ottenere il giusto risultato è che devi avere una conoscenza completa del comportamento di threading dell'intero programma al fine di garantirne la sicurezza.
Ancora una volta, guarda il mio esempio: ogni metodo è banale . È il modo in cui i metodi interagiscono tra loro a livello "globale" che rende il deadlock del programma. Non puoi guardare ogni metodo e selezionarlo come "sicuro" e quindi aspettarti che l'intero programma sia sicuro, non più di quanto tu possa concludere che poiché la tua casa è fatta di mattoni al 100% non vuoti che la casa è anche non cavo. La cavità di una casa è una proprietà globale dell'intera cosa, non un aggregato delle proprietà delle sue parti.