Jika metode hanya mengakses variabel lokal, itu aman untuk thread. Itu saja?
Sama sekali tidak. Anda dapat menulis sebuah program dengan hanya satu variabel lokal yang diakses dari satu utas yang tidak utas:
https://stackoverflow.com/a/8883117/88656
Apakah itu berlaku untuk metode statis juga?
Benar-benar tidak.
Satu jawaban, disediakan oleh @Cybis, adalah: "Variabel lokal tidak dapat dibagi di antara utas karena setiap utas mendapat tumpukannya sendiri."
Benar-benar tidak. Karakteristik pembeda dari variabel lokal adalah bahwa itu hanya terlihat dari dalam lingkup lokal , bukan dialokasikan pada pool sementara . Sangat sah dan memungkinkan untuk mengakses variabel lokal yang sama dari dua utas yang berbeda. Anda dapat melakukannya dengan menggunakan metode anonim, lambdas, blok iterator, atau metode async.
Apakah itu berlaku untuk metode statis juga?
Benar-benar tidak.
Jika suatu metode dilewatkan objek referensi, apakah itu melanggar keselamatan thread?
Mungkin.
Saya telah melakukan beberapa penelitian, dan ada banyak di luar sana tentang kasus-kasus tertentu, tetapi saya berharap dapat mendefinisikan, dengan hanya menggunakan beberapa aturan, pedoman untuk mengikuti untuk memastikan metode aman thread.
Anda harus belajar hidup dengan kekecewaan. Ini adalah subjek yang sangat sulit.
Jadi, saya kira pertanyaan pamungkas saya adalah: "Apakah ada daftar pendek aturan yang menentukan metode thread-safe?
Nggak. Seperti yang Anda lihat dari contoh saya sebelumnya, metode kosong dapat menjadi non-thread-safe . Anda mungkin juga bertanya "apakah ada daftar pendek aturan yang memastikan metode itu benar ". Tidak, tidak ada. Keamanan benang tidak lebih dari jenis kebenaran yang sangat rumit.
Selain itu, fakta bahwa Anda mengajukan pertanyaan menunjukkan kesalahpahaman mendasar Anda tentang keamanan benang. Keamanan thread adalah global , bukan properti lokal dari suatu program. Alasan mengapa sangat sulit untuk mendapatkan yang benar adalah karena Anda harus memiliki pengetahuan lengkap tentang perilaku threading dari seluruh program untuk memastikan keamanannya.
Sekali lagi, lihat contoh saya: setiap metode adalah sepele . Ini adalah cara metode berinteraksi satu sama lain pada tingkat "global" yang membuat kebuntuan program. Anda tidak dapat melihat setiap metode dan memeriksanya sebagai "aman" dan kemudian berharap bahwa seluruh program aman, lebih dari yang dapat Anda simpulkan bahwa karena rumah Anda terbuat dari 100% batu bata tidak berlubang, maka rumah tersebut juga tidak berlubang. Kekosongan sebuah rumah adalah properti global dari semuanya, bukan agregat dari properti bagian-bagiannya.