Ada pertanyaan bodoh sederhana yang mengganggu saya dan membuat beberapa argumen di benak saya. Saya ingin membuang semua keraguan tentang pertanyaan di bawah ini.
class Clstest{
public static String testStaticMethod(String inFileStr) {
// section 0
// section 1
// do something with inFileStr
// section 2
// section 3
return inFileStr;
}
}
Mari kita asumsikan ada lima utas yang masing-masing menjalankan panggilan ke Clstest.testStaticMethod("arg-n")
pada saat yang sama.
Utas 1 panggilan Clstest.testStaticMethod("arg-1")
.
Saat utas 1 ada di bagian 1, utas 2 memanggil Clstest.testStaticMethod("arg-2")
.
Lalu apa yang akan terjadi pada Thread 1? Apakah akan masuk ke status tidur?
Ketika Thread 1 mendapat kesempatan, apakah ia akan melanjutkan eksekusi dari bagian 1 di mana ia dijeda?
Bagaimana itu terjadi ketika ada satu Clstest.testStaticMethod
dan sama Clstest.testStaticMethod
dibagikan di antara kelima utas?
Apakah ada kemungkinan untuk menukar yang inFileStr
dikirim oleh beberapa utas?
sumber
Jawaban:
Jawaban Hans Passant bagus. Tetapi saya pikir saya akan mencoba dan menjelaskan pada tingkat yang sedikit lebih sederhana untuk siapa saja yang menemukan ini dan masih baru mengenal Java. Ini dia ..
Memori di java dibagi menjadi dua jenis - heap dan stack. Heap adalah tempat semua objek berada dan stack adalah tempat utas melakukan tugasnya. Setiap utas memiliki tumpukannya sendiri dan tidak dapat mengakses tumpukan satu sama lain. Setiap utas juga memiliki penunjuk ke kode yang menunjuk ke sedikit kode yang sedang mereka jalankan.
Saat utas mulai menjalankan metode baru, utas akan menyimpan argumen dan variabel lokal dalam metode itu di tumpukannya sendiri. Beberapa dari nilai ini mungkin menjadi petunjuk ke objek di heap. Jika dua utas menjalankan metode yang sama pada saat yang sama, keduanya akan memiliki penunjuk kode yang menunjuk ke metode itu dan memiliki salinan argumen dan variabel lokal sendiri di tumpukannya. Mereka hanya akan mengganggu satu sama lain jika benda-benda di tumpukannya mengarah ke benda yang sama di tumpukan. Dalam hal ini segala macam hal mungkin terjadi. Namun seperti yang ditunjukkan Hans, String tidak dapat diubah (tidak dapat diubah) jadi kami aman jika ini adalah satu-satunya objek yang "dibagikan".
Begitu banyak utas dapat menjalankan metode yang sama. Mereka mungkin tidak berjalan pada saat yang sama - tergantung berapa banyak core yang Anda miliki di mesin Anda saat JVM memetakan utas Java ke utas OS, yang dijadwalkan ke utas perangkat keras. Oleh karena itu, Anda memiliki sedikit kendali atas cara utas ini menyisipkan tanpa menggunakan mekanisme sinkronisasi yang rumit .
Perhatikan bahwa tidur adalah sesuatu yang dilakukan utas pada dirinya sendiri.
sumber
Tidak, menjalankan utas tidak memengaruhi utas lain selama tidak disinkronkan dengan sengaja. Jika Anda memiliki lebih dari satu inti prosesor, semua mesin baru memilikinya, utas tersebut kemungkinan besar akan dieksekusi pada waktu yang sama. Itu menjadi sedikit lebih kecil kemungkinannya ketika Anda memulai 5 utas karena mesin Anda mungkin tidak memiliki cukup inti. Sistem operasi dipaksa untuk memilih di antara mereka, memberi mereka waktu masing-masing untuk dijalankan. Pekerjaan penjadwal utas. Sebuah utas tidak akan berada dalam status "tidur", itu hanya dijeda dan menunggu penjadwal utas memberikan kesempatan untuk berjalan. Ini akan melanjutkan di mana itu diinterupsi oleh penjadwal.
Tidak ada kemungkinan seperti itu, utas memiliki tumpukannya sendiri sehingga setiap argumen metode dan variabel lokal akan unik untuk setiap utas. Menggunakan string selanjutnya menjamin bahwa utas ini tidak dapat saling mengganggu karena string tidak dapat diubah.
Tidak ada jaminan seperti itu jika argumennya adalah referensi ke jenis objek yang bisa berubah lainnya. Atau jika metode itu sendiri menggunakan variabel yang statis atau referensi ke objek di heap. Sinkronisasi diperlukan ketika sebuah thread mengubah objek dan thread lain membacanya. Kata kunci kunci dalam bahasa C # adalah cara boilerplate untuk mengimplementasikan sinkronisasi yang diperlukan tersebut. Fakta bahwa metode ini statis tidak berarti sinkronisasi semacam itu tidak pernah diperlukan. Kemungkinannya kecil karena Anda tidak perlu khawatir tentang utas yang mengakses objek yang sama (membagikan ini ).
sumber