1、什么是線程安全?
線程安全概念:當多個線程訪問某一個類(對象或方法)時,對象對應的公共數據區始終都能表現正確,那么這個類(對象或方法)就是線程安全的。
Java平台中,因為有內置鎖的機制,每個對象都有鎖的功能。Java虛擬機會為每個對象維護兩個“池”
對於任意的對象objectX,objectX的Entry Set用於存儲等待獲取objectX這個鎖的所有線程,也就是傳說中的鎖池。
objectX的Wait Set用於存儲執行了objectX.wait()/wait(long)的線程,也就是等待池。
Synchronized(同步方法/代碼塊): 可以在任意類及方法上面加鎖,而加鎖的這段代碼稱為“互斥區”或者“臨界區”。
通過鎖來實現資源的排它性,從而實際目標代碼段同一時間只會被一個線程執行,進而保證了目標代碼段的原子性。這是一種以犧牲性能為代價換來的安全。
那么在某些特殊場景下,你就要抉擇性能重要還是安全重要,從而采用不用的策略。
2 、案例演示
public class Thread001 extends Thread{
private int count = 10 ;
public synchronized void run(){ count-- ; System.out.println(this.currentThread().getName() + " count = "+ count); }
public static void main(String[] args) {
Thread001 ttt = new Thread001(); Thread t1 = new Thread(ttt,"t1"); Thread t2 = new Thread(ttt,"t2"); Thread t3 = new Thread(ttt,"t3"); Thread t4 = new Thread(ttt,"t4"); Thread t5 = new Thread(ttt,"t5"); t1.start(); t2.start(); t3.start(); t4.start(); t5.start(); } } |
總結:
當多個線程訪問Thread001的run方法時,以排隊的方式進行處理。
一個線程想要執行synchronized修飾的方法里的代碼:
1、 嘗試獲得鎖
2 、如果拿到鎖,執行synchronized代碼體內容;拿不到鎖,這個線程就會進入“鎖池”,不斷的嘗試獲得這把鎖,直到拿到為止,而且是多個線程同時去競爭這把鎖。
那么“鎖池”和“等待池”又有什么區別呢?
接下來.......
請關注我哦,馬上來.......