Java--辨別線程安全與線程不安全

在學習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();
      //...
 }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章