1.wait/notify是Object提供的native方法,可以用來線程之間的通信。
wait/notify結合synchronized可以實現一個線程安全的消息隊列。
2、BlockingQueuee
BlockingQueue是JDK提供的線程安全的消息隊列,對增加、刪除、獲取提供了四種的操作:
1、阻塞(put、take)
2、拋異常(add,remove)
3、阻塞等待超時(offer,poll)
4、返回特殊值(offer,poll)
BlockingQueue是個接口,JDK也提供了相應的實現,實現中主要使用Lock和Condition,Condition有await和signal方法,類似wait和notify方法。
想要了解Lock的機制或者自己要實現一個鎖,就得了解
AQS(AbstractQueuedSynchronizer)是什么了,Lock的具體實現
ReentrantLock,ReadLock,WriteLock都是基于
AQS實現的,這里暫時不說AQS了,說下BlockingQueue具體的幾個實現:
1、ArrayBlockingQueue:有界隊列,底層是數組
2、LinkedBlockingQueue:無界隊列,底層是個單向鏈表
3、SynchronousQueue:同步隊列,不提供任何容器來存放數據
4、PriorityBlockingQueue:優先級無界隊列,底層是二叉樹最小堆
5、DelayQueue:支持延時獲取元素的無界阻塞隊列。底層是使用PriorityQueue來實現。
所以,wait/notify和BlockingQueue都可以實現消息隊列,解決生產者和消費者的問題。不過BlockingQueue的實現提供更多的功能。
希望對你有幫助,可以關注下我,后續會分享更多架構和Java知識,謝謝。