Java中的wait方法和條件變量是實現線程同步的兩種常用方式。
wait方法是java.lang.Object類中的一個方法,當一個線程調用該方法時,會讓該線程暫時掛起,直到另一個線程調用該對象的notify方法或notifyAll方法喚醒該線程。wait方法必須在synchronized代碼塊中使用,否則會拋出IllegalMonitorStateException異常。
synchronized (lock) { while (!condition) { lock.wait(); } }
上述代碼片段中,lock表示鎖對象,condition表示一個條件或者標志位,如果condition為false,線程將進入等待狀態,直到另一個線程調用lock.notify()或lock.notifyAll()方法喚醒此線程。
條件變量是一種比wait方法更靈活的線程同步方式。它可以解決wait方法可能出現的虛假喚醒問題,還能夠實現多個線程針對不同條件的等待。在Java中,條件變量可以使用java.util.concurrent.locks.Condition接口來實現。
Lock lock = new ReentrantLock(); Condition condition = lock.newCondition(); lock.lock(); try { while (!condition) { condition.await(); } } finally { lock.unlock(); }
上述代碼片段中,lock表示鎖對象,condition表示條件變量,調用await方法將當前線程加入到條件變量的等待隊列中,直到另一個線程調用signal或signalAll方法喚醒它。
總的來說,wait方法和條件變量都可以用來實現線程同步,但在不同場景下使用時需要根據需要選擇不同的方式。