1.使用wait和notify。這是最簡單最基礎的實現,緩衝區滿和爲空時都調用wait()方法等待,當生產者生產了一個產品或者消費者消費了一個產品以後會喚醒全部線程。安全
2.可重入鎖ReentrantLock的實現。可重入鎖,也叫作遞歸鎖,指的是同一線程 外層函數得到鎖以後 ,內層遞歸函數仍然有獲取該鎖的代碼,但不受影響,簡單來講,該鎖維護這一個與獲取鎖相關的計數器,若是擁有鎖的某個線程再次獲得鎖,那麼獲取計數器就加1,函數調用結束計數器就減1,而後鎖須要被釋放兩次才能得到真正釋放。已經獲取鎖的線程進入其餘須要相同鎖的同步代碼塊不會被阻塞。函數
3.阻塞隊列BlockingQueue的實現。BlockingQueue即阻塞隊列,從阻塞這個詞能夠看出,在某些狀況下對阻塞隊列的訪問可能會形成阻塞。被阻塞的狀況主要有以下兩種:線程
3.1.當隊列滿了的時候進行入隊列操做遞歸
3.2..當隊列空了的時候進行出隊列操做 所以,當一個線程對已經滿了的阻塞隊列進行入隊操做時會阻塞,除非有另一個線程進行了出隊操做,當一個線程對一個空的阻塞隊列進行出隊操做時也會阻塞,除非有另一個線程進行了入隊操做。 從上可知,阻塞隊列是線程安全的。隊列