Saya bertanya-tanya apakah Anda memiliki metode statis yang tidak disinkronkan, tetapi tidak mengubah variabel statis apakah aman? Bagaimana jika metode ini membuat variabel lokal di dalamnya? Misalnya, apakah kode berikut ini aman untuk digunakan?
public static String[] makeStringArray( String a, String b ){
return new String[]{ a, b };
}
Jadi jika saya memiliki dua utas yang memanggil metode ini secara terus-menerus dan bersamaan, satu dengan anjing (katakanlah "dane besar" dan "anjing jantan") dan yang lainnya dengan kucing (katakanlah "persia" dan "siam") apakah saya akan mendapatkan kucing dan anjing dalam array yang sama? Atau akankah kucing dan anjing tidak pernah berada di dalam doa yang sama dengan metode ini pada saat yang sama?
java
multithreading
concurrency
static
thread-safety
Kereta luncur
sumber
sumber
Jawaban:
Metode ini 100% aman, bahkan jika tidak
static
. Masalah dengan keamanan ulir muncul ketika Anda perlu berbagi data di antara utas - Anda harus menjaga atomicity, visibilitas, dll.Metode ini hanya beroperasi pada parameter, yang berada di stack dan referensi ke objek yang tidak dapat diubah pada heap. Stack secara inheren bersifat lokal untuk utas , jadi tidak ada pembagian data yang terjadi.
Objek yang
String
tidak dapat diubah ( dalam hal ini) juga aman dari thread karena sekali dibuat mereka tidak dapat diubah dan semua utas melihat nilai yang sama. Di sisi lain jika metode itu menerima (bisa berubah)Date
Anda bisa memiliki masalah. Dua utas secara bersamaan dapat memodifikasi instance objek yang sama, yang menyebabkan kondisi balapan dan masalah visibilitas.sumber
Suatu metode hanya bisa tidak aman ketika ia mengubah beberapa status bersama. Apakah itu statis atau tidak tidak relevan.
sumber
Fungsi ini sangat aman untuk thread.
Jika Anda memikirkannya ... anggap apa yang akan terjadi jika ini berbeda. Setiap fungsi yang biasa akan memiliki masalah threading jika tidak disinkronkan, sehingga semua fungsi API di JDK harus disinkronkan, karena mereka berpotensi dipanggil oleh banyak utas. Dan karena sebagian besar waktu aplikasi menggunakan beberapa API, aplikasi multithreaded secara efektif tidak mungkin.
Ini terlalu konyol untuk dipikirkan, jadi hanya untuk Anda: Metode tidak aman jika ada alasan yang jelas mengapa mungkin ada masalah. Cobalah untuk selalu berpikir tentang bagaimana jika ada beberapa utas dalam fungsi saya, dan bagaimana jika Anda memiliki langkah-debugger dan akan satu langkah demi langkah maju yang pertama ... lalu utas kedua ... mungkin yang kedua lagi ... apakah akan ada masalah? Jika Anda menemukannya, itu tidak aman.
Perlu diketahui juga, bahwa sebagian besar kelas Java 1.5 Collection bukan threadsafe, kecuali yang dinyatakan, seperti ConcurrentHashMap.
Dan jika Anda benar-benar ingin menyelami ini, perhatikan dengan cermat kata kunci yang mudah menguap dan SEMUA efek sampingnya. Lihatlah kelas Semaphore () dan Lock (), dan teman-teman mereka di java.util.Concurrent. Baca semua dokumen API di sekitar kelas. Layak untuk belajar dan memuaskan juga.
Maaf atas jawaban yang terlalu rumit ini.
sumber
Gunakan
static
kata kunci dengan metode statis tersinkronisasi untuk memodifikasi data statis yang dibagi di antara utas. Denganstatic
kata kunci, semua utas yang dibuat akan bersaing untuk satu versi metode ini.Gunakan
volatile
kata kunci bersama dengan metode instance yang disinkronkan akan menjamin bahwa setiap utas memiliki salinan sendiri dari data bersama dan tidak ada baca / tulis akan bocor di antara utas.sumber
Objek string menjadi tidak berubah adalah alasan lain untuk skenario thread-safe di atas. Alih-alih jika objek yang dapat diubah digunakan (misalkan makeMutableArray ..) maka pasti thread-safety akan rusak.
sumber