高并发编程-深入分析wait和sleep的区别并结合源码示例佐证
生活随笔
收集整理的這篇文章主要介紹了
高并发编程-深入分析wait和sleep的区别并结合源码示例佐证
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 概述
- 區別
- sleep是Thread的方法,wait是Object的方法
- sleep不會釋放鎖(Monitor), wait會讓當前線程釋放鎖
- sleep 不依賴 Monitor,但是wait需要依賴Monitor
- sleep方法不需要被喚醒,wait需要喚醒 (wait(long millons) 方法除外)
概述
wait和sleep的區別,這個確實是面試中非常常見的一道題目,這里我們通過源碼并結合示例來一起加深下對wait和sleep的理解 。
主要有4點不同
-
sleep是Thread的方法,wait是Object的方法
-
sleep不會釋放鎖(Monitor), wait會讓當前線程釋放鎖
-
sleep 不依賴 Monitor,但是wait需要依賴Monitor
-
sleep方法不需要被喚醒,wait需要喚醒 (wait(long millons) 方法除外)
接下來我們分別來看下這4點區別
區別
sleep是Thread的方法,wait是Object的方法
直接看下源碼即可
Object#wait
Thread#sleep
sleep不會釋放鎖(Monitor), wait會讓當前線程釋放鎖
sleep不會釋放鎖(Monitor) 舉個例子
package com.artisan.test;import java.util.Date; import java.util.stream.Stream;public class SleepAndWaitDiffDemo {private final static Object LOCK = new Object();private static void method1() {synchronized (LOCK){System.out.println(Thread.currentThread().getName() + " -- " + new Date());try {Thread.sleep(10_000);} catch (InterruptedException e) {e.printStackTrace();}}}public static void main(String[] args) {// 開啟兩個線程Stream.of("T1","T2").forEach(threadName -> {new Thread(threadName){@Overridepublic void run() {super.run();// 調用methood1method1();}}.start();});} }輸出
wait會讓當前線程釋放鎖
package com.artisan.test;import java.util.Date; import java.util.stream.Stream;public class SleepAndWaitDiffDemo {private final static Object LOCK = new Object();private static void method2() {synchronized (LOCK){System.out.println(Thread.currentThread().getName() + " -- " + new Date());try {LOCK.wait();} catch (InterruptedException e) {e.printStackTrace();}}}public static void main(String[] args) {// 開啟兩個線程Stream.of("T1","T2").forEach(threadName -> {new Thread(threadName){@Overridepublic void run() {super.run();// 調用methood2method2();}}.start();});} }sleep 不依賴 Monitor,但是wait需要依賴Monitor
package com.artisan.test;public class SleepAndWaitDiffDemo {private final static Object LOCK = new Object();private static void method1() {try {Thread.sleep(2_000);System.out.println("method1休眠2秒結束");} catch (InterruptedException e) {e.printStackTrace();}}private static void method2() {try {// 不加synchronized關鍵字,會拋出IllegalMonitorStateExceptioLOCK.wait();} catch (InterruptedException e) {e.printStackTrace();}}public static void main(String[] args) {method1();method2();} }運行結果
如何改呢?
private static void method2() {synchronized (LOCK){try {LOCK.wait();} catch (InterruptedException e) {e.printStackTrace();}}}synchronized (LOCK),然后 LOCK.wait即可 。
sleep方法不需要被喚醒,wait需要喚醒 (wait(long millons) 方法除外)
從 sleep不會釋放鎖(Monitor), wait會讓當前線程釋放鎖 這個例子中,我們可以看到sleep方法執行后,整個主線程就退出了,但 wait方法的,T1 和 T2 都處于waiting狀態了,需要被喚醒才能繼續執行…
總結
以上是生活随笔為你收集整理的高并发编程-深入分析wait和sleep的区别并结合源码示例佐证的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高并发编程-使用wait和notifyA
- 下一篇: 高并发编程-线程生产者消费者的综合示例