Rumah >Java >javaTutorial >Mengapa Mesti Object.wait() Sentiasa Dipanggil Dalam Blok Tersegerak?

Mengapa Mesti Object.wait() Sentiasa Dipanggil Dalam Blok Tersegerak?

DDD
DDDasal
2024-12-14 09:25:12442semak imbas

Why Must Object.wait() Always Be Called Within a Synchronized Block?

Penyegerakan yang Diperlukan bagi Wait() untuk Memastikan Kebolehramalan

Object.wait() mesti berada dalam blok yang disegerakkan untuk menjamin keselamatan thread dan mencegah IllegalMonitorStateException.

Sebab Penyegerakan Keperluan

Tunggu mengeluarkan monitor yang dikaitkan dengan objek, membenarkan urutan lain memperolehnya. Jika wait() boleh digunakan di luar blok yang disegerakkan, tingkah laku yang tidak dapat diramalkan boleh timbul.

Potensi Bahaya Tunggu() Tanpa Penyegerakan

Pertimbangkan pelaksanaan baris gilir yang menyekat tanpa tunggu yang disegerakkan():

class BlockingQueue {
    Queue<String> buffer = new LinkedList<>();

    public void give(String data) {
        buffer.add(data);
        notify(); // Signal waiting consumer
    }

    public String take() throws InterruptedException {
        while (buffer.isEmpty()) {
            wait(); // Suspend thread without synchronization
        }
        return buffer.remove();
    }
}

Dalam ini contoh:

  1. Urutan pengguna boleh memanggil take(), semak sama ada penimbal kosong, dan kemudian panggil tunggu() tanpa penyegerakan.
  2. Sebelum urutan pengguna benar-benar tidur, a urutan pengeluar boleh menambah elemen pada penimbal dan memberitahu urutan menunggu.
  3. Walau bagaimanapun, urutan pengguna mungkin terlepas pemberitahuan kerana kekurangan penyegerakan.
  4. Urutan pengeluar mungkin tidak akan memberitahu pengguna kemudiannya, mengakibatkan kebuntuan.

Isu Penyegerakan Universal

Isu penyegerakan ini terpakai secara universal untuk menunggu/ memberitahu mekanisme, tanpa mengira pelaksanaan khusus. Tanpa penyegerakan, sentiasa ada risiko keadaan perlumbaan dan tingkah laku benang yang tidak dapat diramalkan. Oleh itu, peraturan "tunggu di dalam disegerakkan" memastikan keselamatan rangkaian dan menghalang isu sedemikian.

Atas ialah kandungan terperinci Mengapa Mesti Object.wait() Sentiasa Dipanggil Dalam Blok Tersegerak?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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