什么是線程安全?


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代碼體內容;拿不到鎖,這個線程就會進入“鎖池”,不斷的嘗試獲得這把鎖,直到拿到為止,而且是多個線程同時去競爭這把鎖。

 

 

       那么“鎖池”和“等待池”又有什么區別呢?

 

       接下來.......

 

       請關注我哦,馬上來.......

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM