Rumah > Java > javaTutorial > Mengapa Kaedah `wait()` Java Mesti Dipanggil Dalam Blok Tersegerak?

Mengapa Kaedah `wait()` Java Mesti Dipanggil Dalam Blok Tersegerak?

Linda Hamilton
Lepaskan: 2024-12-15 08:53:13
asal
918 orang telah melayarinya

Why Must Java's `wait()` Method Be Called Within a Synchronized Block?

Mengapa Tunggu() Mesti Berada Dalam Blok Tersegerak

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:

  1. Urutan pengeluar boleh menyelang sendiri antara isEmpty() check dan panggilan tunggu() pengguna.
  2. Pengeluar akan menambah elemen pada baris gilir, kemudian maklumkan urutan lain melalui notify().
  3. Disebabkan panggilan tunggu() yang tidak tepat pada masanya, pengguna tidak akan menerima pemberitahuan dan kekal digantung selama-lamanya.

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:

  • Jika wait() dipanggil, pemberitahuan daripada urutan lain tidak akan pernah terlepas.
  • Predikat yang diperiksa sebelum memanggil wait() (cth., buffer.isEmpty()) akan kekal sah sehingga wait() dipanggil.

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan