1.synchronized同步方法
方法內的變數為執行緒安全的
執行緒中的例項變數非執行緒安全,易出現髒讀,方法上加synchronized關鍵字
多個執行緒訪問同乙個物件的同步方法時,執行緒安全
synchronized取得的鎖都是物件鎖,而不是把一段**或者方法當作鎖(多個執行緒訪問多個物件的同步方法,資料非同步)
2.synchronized同步**塊
synchronized(this),該同步**塊 也是鎖定當前物件的
3.單例模式
3.1 餓漢模式/立即載入
多執行緒獲取單例,執行緒安全
public class singleton
}3.2懶漢模式/延遲載入
多執行緒獲取,執行緒非同步,解決方法
3.2.1dcl雙檢查鎖機制 double checked locking
public class singleton}}
}catch(interruptedexception e)
}return singleton;
}3.3 使用靜態內建類
public class singleton
public static singleton getinstance()}}
3.3使用static建立單例模式
public class singleton
public static singleton getinstance()
}4.string常量池快取
synchronized(string) ,不同的同步物件a、b,如果string的值相同,則持有相同的鎖;因此同步**塊大多數情況下不使用string作為鎖物件,改用其他, 比如new object()(因為objectbu不放入快取中)
5.synchronized方法會對物件加鎖,因此在訪問同乙個物件的不同方法時,容易造成死迴圈(例:同步a方法一直被呼叫,則同步b方法就死鎖,沒有呼叫的機會);因此可以用同步**塊來解決類似問題
5.死鎖問題,不同的執行緒都在等待乙個根本不可能釋放的鎖,從而導致都不可能完成任務。
利用jdk檢視死鎖,1)進入jdk/bin 目錄,命令 jps ->3000 run ;2)jstack -l 3000 ->founc 1 deadlock。
死鎖都是程式自身的bug,因此需要程式設計師 調整**結構來解決
6.volatile關鍵字
主要作用是使變數在多個執行緒間可見,強制從公共堆疊中取得變數的值,而不是從執行緒私有棧中取得。
多執行緒相關
多執行緒示例 public class threadtest start new thread new runnable start new thread new runnable start class print public void print2 public void print3 上面的...
多執行緒相關
方法1 public class threadcreat 方法2 新建乙個類繼承thread類,thread類本身實現了runnable介面,可以通過繼承重寫thread類的run方法 實現runnable介面而來 來寫執行緒的執行體,然後例項化這個新建的類來新建乙個執行緒 1.同步阻塞 想要獲得鎖...
多執行緒 執行緒池相關
銀行有四個視窗辦業務,好比四個cpu。如果只開乙個執行緒的話,相當於所有辦業務的人都排成一隊在乙個視窗辦業務,或者說每個人都必須等上乙個人辦完業務之後隨機選乙個視窗,總之就是序列乙個個來。所以這體現了多執行緒優點的就是可以充分利用現在計算機配置多核cpu的硬體特性,把多核cpu利用起來提高任務的處理...