Java之執行緒一(Java多執行緒程式設計核心技術)
一、等待/通知機制的實現
1、wait()的作用是使當前執行程式碼的執行緒進行等待,將當前執行緒放入‘預執行佇列’中,並且在wait()所在的程式碼處停止執行,直到接到通知或者中斷為止。注意:在呼叫wait()之前,執行緒必須獲得該物件的物件級別鎖,所以只能在同步方法或者同步塊中呼叫wait()方法。——wait方法使執行緒停止執行
2、notify()方法也要放在同步方法或者同步塊中,在呼叫前,也要獲取該物件級別的鎖。該方法用來通知那些可能等待該物件的物件鎖的其他執行緒,如果有多個執行緒,線上程規劃器隨機挑選一個呈wait狀態的執行緒,對其發出通知notify,在執行notify方法後,當前執行緒不會馬上釋放該物件鎖,呈wait狀態的執行緒也並不能馬上獲取該物件鎖,要等到notify方法的執行緒將程式執行完,也就是推出synchronized程式碼塊後,當前執行緒才會釋放鎖,而呈wait狀態的執行緒才可以獲取該物件鎖。——notify使停止的執行緒繼續執行
3、wait和notify如果沒有持有合適的鎖,會丟擲IllegalMonitorStateException
4、notifyAll()方法可以使正在等待佇列中等待同一共享資源的“全部”執行緒從等待狀態退出,進入可執行狀態,按照執行緒優先順序執行。
5、wait(long time) 超時自動喚醒(在這段時間內也可以被其他執行緒喚醒)
6、不能通知過早,應該先執行wait,再執行notify
二、join使用
1、A.join() 使子執行緒A一直執行到結束,讓主執行緒阻塞
2、join與sleep的區別:join內部呼叫了wait方法,釋放了鎖,而sleep卻不釋放鎖
三、ThreadLocal(解決執行緒之間的隔離性)
1、可以將ThreadLoacl類比喻成全域性存放資料的盒子,盒子中可以儲存每個執行緒的私有資料。
四、單例模式
package com.yven.thread; /** * DCL 雙重檢查鎖 執行緒安全 效率高 單例模式 * @author Administrator * */ public class Sington { private static volatile Sington sington; private Sington(){} public static Sington getInstance(){ if(sington == null ){ synchronized(Sington.class){ if(sington == null){ sington = new Sington(); } } } return sington; } } /** * 餓漢模式 執行緒安全 * @author Administrator * */ class Sington1{ private static Sington1 sington = new Sington1(); private Sington1(){} public static Sington1 getInstance(){ return sington; } } /** * 懶漢模式,非執行緒安全,需要在getInstance方法中新增synchronized * @author Administrator * */ class Sington2{ private static Sington2 sington ; private Sington2(){} public static Sington2 getInstance(){ if( sington == null){ sington = new Sington2(); } return sington; } } /** * 執行緒安全 ,效率低 * @author Administrator * */ class Sington3{ private static Sington3 sington ; private Sington3(){} synchronized public static Sington3 getInstance(){ if( sington == null){ sington = new Sington3(); } return sington; } } /** * 執行緒不安全 * @author Administrator * */ class Sington4{ private static Sington4 sington ; private Sington4(){} public static Sington4 getInstance(){ if( sington == null){ synchronized(Sington4.class){ sington = new Sington4(); } } return sington; } }