Prelude:
Penyegerakan di Java memainkan peranan penting dalam melindungi aplikasi berbilang benang daripada ketidakkonsistenan. Satu kaedah sedemikian, tunggu(), membenarkan utas untuk menjeda pelaksanaan sehingga peristiwa tertentu berlaku. Walau bagaimanapun, untuk menggunakan wait(), kod mesti berada dalam blok yang disegerakkan.
Rasional untuk Penyegerakan:
Kaedah wait() melepaskan kunci intrinsik yang dikaitkan dengan objek, membenarkan benang lain memperolehnya. Walau bagaimanapun, pelepasan kunci ini menimbulkan potensi bahaya jika wait() dibenarkan di luar blok yang disegerakkan.
Kerentanan Penantian Tidak Segerak:
Pertimbangkan senario berikut: a panggilan benang pengguna take() pada baris gilir terhad, menyemak sama ada ia kosong (mis., melalui buffer.isEmpty()). Jika ya, pengguna biasanya akan memanggil wait() untuk menunggu baris gilir menjadi tidak kosong. Walau bagaimanapun, jika wait() dibenarkan di luar blok yang disegerakkan:
Keadaan ini boleh membawa kepada kebuntuan, di mana urutan pengeluar terhenti menunggu penggunaan oleh pengguna, yang dengan sendirinya digantung secara tersilap.
Penguatkuasaan Blok Tersegerak:
Dengan mengekang tunggu() ke dalam blok disegerakkan, Java memastikan jaminan penting: apabila benang memasuki blok disegerakkan, ia sememangnya memperoleh kunci yang dikaitkan dengan objek, menghalang urutan lain daripada melaksanakan kod dalam blok yang sama sehingga kunci dilepaskan.
Ini menjamin bahawa:
Kesimpulan:
Keperluan untuk menunggu() berada dalam blok yang disegerakkan adalah penting untuk mengekalkan konsistensi dan menghalang keadaan perlumbaan dalam persekitaran berbilang benang. Dengan memastikan akses disegerakkan untuk menunggu/memberitahu kefungsian, Java melindungi daripada perangkap yang timbul apabila berbilang rangkaian secara serentak mengubah suai dan menunggu sumber yang dikongsi.
Atas ialah kandungan terperinci Mengapa Kaedah `wait()` Java Mesti Dipanggil Dalam Blok Tersegerak?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!