Java--辨別執行緒安全與執行緒不安全
阿新 • • 發佈:2019-01-04
在學習Java的時候經常會發現有很多名稱相似的類,比如HashMap和Hashtable,StringBuffer和StringBuilder等等,他們的名稱相似,功能也有相似的地方,所以初學者在學習之中往往會很疑惑,他們都有哪些不同呢?而在深入研究這個問題的時候,就會發現他們都有這樣兩個概念,執行緒安全和執行緒不安全,這也就是本文主要講的內容。
1.什麼是執行緒安全和執行緒不安全呢?
假設A和B同時去不同ATM上取同一張卡的1000塊錢,如果是執行緒不安全,那麼A和B可以同時取到1000塊錢(兩人賺大發啦),而如果執行緒安全呢,就只有一個人能取出來1000塊錢。
執行緒安全是指多個執行緒在執行同一段程式碼的時候採用加鎖機制,使每次的執行結果和單執行緒執行的結果都是一樣的,不存在執行結果的二義性。
執行緒不安全就是不提供加鎖機制保護,有可能出現多個執行緒先後更改資料造成所得到的資料是髒資料
2.是什麼決定的執行緒安全問題呢?
執行緒安全問題都是由全域性變數及靜態變數引起的。
若每個執行緒中對全域性變數、靜態變數只有讀操作,而無寫操作,一般來說,這個全域性變數是執行緒安全的;若有多個執行緒同時執行寫操作,一般都需要考慮執行緒同步,否則的話就可能影響執行緒安全。
3.有哪些可以解決多執行緒併發訪問資源的安全問題呢?
有三種方式:分別是 同步程式碼塊 、同步方法和鎖機制(Lock)
(1)同步程式碼塊:
synchronized(同步鎖)
{
//方法體
}
(2)同步方法:給多執行緒訪問的成員方法加上synchronized修飾符 public synchronized void test(){ //方法體 }
以上兩種該方法都用到了Java語言的關鍵字synchronized,當它用來修飾一個方法或者一個程式碼塊的時候,能夠保證在同一時刻最多隻有一個執行緒執行該段程式碼。
(3)鎖機制(Lock) //Java提供的同步程式碼塊的另一種機制,比synchronized關鍵字更強大也更加靈活。 //這種機制基於Lock介面及其實現類(例如:ReentrantLock) //它比synchronized關鍵字好的地方: //1、提供了更多的功能。tryLock()方法的實現,這個方法試圖獲取鎖, //如果鎖已經被其他執行緒佔用,它將返回false並繼續往下執行程式碼。 //2、Lock介面允許分離讀和寫操作,允許多個執行緒讀和只有一個寫執行緒。 //3、具有更好的效能 public class PrintQueue { private final Lock A=new ReentrantLock(); //... }