Tunggu-Notify Adegan
Adegan-notify yang khas umumnya terkait dengan dua konten berikut:
1. Variabel negara
Ketika utas perlu menunggu, itu selalu disebabkan oleh beberapa kondisi. Misalnya, mengisi antrian, ketika elemen antrian penuh, utas perlu berhenti berjalan. Ketika elemen antrian kosong, lanjutkan eksekusi mereka sendiri.
2. Kondisi Predikat
Ketika utas ditentukan apakah akan memasukkan tunggu atau bangun dari Notify, perlu untuk menguji apakah kondisi status dipenuhi. Misalnya, menambahkan elemen ke antrian, antrian penuh, sehingga memblokir utas saat ini. benang." Pada saat ini, proses menunggu elemen akan dibangunkan, dan kemudian menilai apakah benar -benar ada ruang untuk antrian saat ini. Next Wake -up.
3. Antrian Kondisi
Setiap objek memiliki antrian kondisi -in dalam. Saat utas memanggil fungsi tunggu pada objek, utas akan ditambahkan ke antrian kondisi objek.
Melihat
Tunggu dan beri tahu adalah bagian penting dari mekanisme sinkronisasi Java. Dikombinasikan dengan penggunaan kata kunci yang disinkronkan, banyak model sinkron yang sangat baik dapat ditetapkan, seperti model konsumen produser. Tetapi saat menggunakan fungsi (), notify (), notifyAll () function, Anda perlu memberikan perhatian khusus pada poin -poin berikut:
Wait (), notify (), notifyAll () Metode bukan milik kelas utas, tetapi milik kelas Yayasan Objek, yaitu, masing -masing objek memiliki fungsi tunggu (), notify (), dan notify (). Karena setiap objek terkunci, kunci adalah dasar dari masing -masing objek, sehingga metode pengoperasian kunci juga merupakan yang paling mendasar.
Hubungi Obj's Wait () dan Notify () Metode, Anda harus mendapatkan kunci OBJ, yaitu, Anda harus ditulis dalam segmen kode yang disinkronkan (OBJ) {...}.
Setelah memanggil obj.wait (), utas tersebut melepaskan kunci OBJ, jika tidak utas B tidak dapat memperoleh kunci OBJ, dan tidak akan dapat membangunkan utas A dalam kode yang disinkronkan (OBJ) {...} segmen.
Ketika metode OBJ.Wait () kembali, Thread A perlu mendapatkan kunci OBJ lagi untuk melanjutkan eksekusi.
Jika utas A1, A2, A3 berada di obj.wait (), utas B memanggil obj.notify () hanya dapat membangunkan salah satu utas A1, A2, A3 (yang ditentukan oleh JVM).
Jika utas B memanggil obj.notifyall (), ia semua dapat membangunkan utas menunggu A1, A2, A3, tetapi utas menunggu untuk terus melaksanakan kalimat berikutnya dari obj.wait (), Anda harus mendapatkan kunci OBJ. Oleh karena itu, utas A1, A2, A3 hanya memiliki satu kesempatan untuk mendapatkan kunci dan terus mengeksekusi.
Ketika Benang B memanggil obj.notify () atau obj.notifyall (), Thread B memegang kunci OBJ. Sampai utas B keluar dari blok kode yang disinkronkan dan lepaskan kunci OBJ, satu di utas A1, A2, A3 memiliki kesempatan untuk mendapatkan kunci objek dan terus mengeksekusi.
Misalnya kode
Struktur kode tipikal dari operasi tunggu utas adalah sebagai berikut:
public void test () melempar InterruptedException {disinkronkan (obj) {while (! Contidition) {obj.wait ();}}}}}}}}}
Mengapa operasi obj.wait () harus ditempatkan dalam siklus? Ada beberapa alasan utama:
1. Kunci objek dapat digunakan untuk melindungi beberapa variabel keadaan. Misalnya, objek tertentu mengunci OBJ untuk melindungi dua variabel status A dan B. Ketika kondisi pernyataan tidak ditetapkan, operasi tunggu terjadi. Sekarang jika operasi variabel negara A terjadi, operasi notifyall dipanggil OBJ, maka semua utas dalam kondisi antrian yang sesuai dengan OBJ dibangunkan. Untuk B juga terbangun pada saat ini, jadi Anda perlu mendaur ulang apakah kondisi B dipenuhi untuk dipenuhi.
2. Kondisi keadaan yang sama dari beberapa utas ditegaskan. Misalnya, adegan menambahkan elemen ke antrian, antrian saat ini penuh, dan banyak utas ingin menambahkan elemen di dalamnya, jadi semuanya. Pada saat ini, utas lain mengambil elemen dari antrian dan memanggil operasi NotifyAll untuk membangunkan semua utas, tetapi hanya satu utas yang dapat menambahkan elemen ke antrian.
3. Kebangkitan palsu. Tanpa diberitahu, menyela atau utasnya secara otomatis dibangunkan. Meskipun situasi ini jarang terjadi dalam praktik, situasi ini dapat dihilangkan melalui siklus menunggu.