wait和notify在鎖競爭中的執行順序
sleep就是正在執行的執行緒主動讓出cpu,cpu去執行其他執行緒,在sleep指定的時間過後,cpu才會回到這個執行緒上繼續往下執行,如果當前執行緒進入了同步鎖,sleep方法並不會釋放鎖,即使當前執行緒使用sleep方法讓出了cpu,但其他被同步鎖擋住了的執行緒也無法得到執行。wait是指在一個已經進入了同步鎖的執行緒內,讓自己暫時讓出同步鎖,以便其他正在等待此鎖的執行緒可以得到同步鎖並執行,只有其他執行緒呼叫了notify方法(notify並不釋放鎖,只是告訴呼叫過wait方法的執行緒可以去參與獲得鎖的競爭了,但不是馬上得到鎖,因為鎖還在別人手裡,別人還沒釋放。如果notify方法後面的程式碼還有很多,需要這些程式碼執行完後才會釋放鎖,可以在notfiy方法後增加一個等待和一些程式碼,看看效果),呼叫wait方法的執行緒就會解除wait狀態和程式可以再次得到鎖後繼續向下執行。
- public class MultiThread {
- /**
- * @param args
- */
- public static void main(String[] args) {
- new Thread(new Thread1()).start();
- try {
- Thread.sleep(10);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- new Thread(new Thread2()).start();
- }
- private static class Thread1 implements Runnable {
- @Override
- public void run() {
- // 由於這裡的Thread1和下面的Thread2內部run方法要用同一物件作為監視器,我們這裡不能用this,因為在Thread2裡面的this和這個Thread1的this不是同一個物件。我們用MultiThread.class這個位元組碼物件,當前虛擬機器裡引用這個變數時,指向的都是同一個物件。
- synchronized (MultiThread.class) {
- System.out.println("enter thread1...");
- System.out.println("thread1 is waiting");
- try {
- // 釋放鎖有兩種方式,第一種方式是程式自然離開監視器的範圍,也就是離開了synchronized關鍵字管轄的程式碼範圍,另一種方式就是在synchronized關鍵字管轄的程式碼內部呼叫監視器物件的wait方法。這裡,使用wait方法釋放鎖。
- MultiThread.class.wait();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println("thread1 is going on...");
- System.out.println("thread1 is being over!");
- }
- }
- }
- private static class Thread2 implements Runnable {
- @Override
- public void run() {
- synchronized (MultiThread.class) {
- System.out.println("enter thread2...");
- System.out.println("thread2 notify other thread can release wait status..");
- // 由於notify方法並不釋放鎖,
- // 即使thread2呼叫下面的sleep方法休息了10毫秒,但thread1仍然不會執行,因為thread2沒有釋放鎖,所以Thread1無法得不到鎖。
- //notify並不釋放鎖,只是告訴呼叫過wait方法的執行緒可以去參與獲得鎖的競爭了,但不是馬上得到鎖,因為鎖還在別人手裡,別人還沒釋放。如果notify方法後面的程式碼還有很多,需要這些程式碼執行完後才會釋放鎖
- MultiThread.class.notify();
- System.out.println("thread2 is sleeping ten millisecond...");
- try {
- Thread.sleep(10);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println("thread2 is going on...");
- System.out.println("thread2 is being over!");
- }
- }
- }
- /**
- * 執行結果:
- * enter thread1...
- thread1 is waiting
- enter thread2...
- thread2 notify other thread can release wait status..
- thread2 is sleeping ten millisecond...
- thread2 is going on...
- thread2 is being over!
- thread1 is going on...
- thread1 is being over!
- */
- }
相關文章
- 多執行緒中的wait與notify執行緒AI
- Java多執行緒的wait()和notify()例子Java執行緒AI
- 深入執行緒的wait()/notify()執行緒AI
- Java多執行緒中wait 和 notify 方法理解Java執行緒AI
- Java多執行緒8:wait()和notify()/notifyAll()Java執行緒AI
- Java多執行緒中的wait/notify通訊模式Java執行緒AI模式
- Java多執行緒 -- wait() 和 notify() 使用入門Java執行緒AI
- java多執行緒wait notify joinJava執行緒AI
- Java 中的 Wait 和 Notify 機制JavaAI
- 執行緒安全(三個條件)Synchronzied,wait和notify執行緒AI
- SQL中rownum和order by的執行順序的問題SQL
- DISTINCT 和 TOP合用的執行順序
- golang中的鎖競爭問題Golang
- 執行緒間協作——wait、notify、notifyAll執行緒AI
- 多執行緒(一)、基礎概念及notify()和wait()的使用執行緒AI
- 不合理的執行順序引發的死鎖
- JavaScript的執行順序JavaScript
- wait()和notify()、notifyAll()AI
- 使用Vue的nextTick引發的執行順序之爭Vue
- Oracle鎖競爭和管理 CUUGOracle
- Jmeter的元件作用域和執行順序JMeter元件
- Sql執行順序SQL
- Java中如何保證執行緒順序執行Java執行緒
- 執行緒篇2:[- sleep、wait、notify、join、yield -]執行緒AI
- java多執行緒 wait() notify()簡單使用Java執行緒AI
- sql中的or與and的執行順序問題SQL
- Unity3D中指令碼的執行順序和編譯順序Unity3D指令碼編譯
- Java for迴圈中語句執行的順序Java
- 在完整恢復模式計劃和執行還原順序模式
- Javascript在頁面載入時的執行順序JavaScript
- SQL語句中的AND和OR執行順序問題SQL
- mysql 中sql語句關鍵字的書寫順序與執行順序MySql
- wait、notify和notifyAll的關係AI
- JavaScript執行順序分析JavaScript
- 任務執行順序
- for語句執行順序
- laravel Event執行順序Laravel
- mySQL 執行語句執行順序MySql