Java併發程式設計 執行緒安全問題

2021-08-13 23:43:07 字數 1884 閱讀 3035

1.執行緒安全的概念

當多個執行緒訪問某乙個類(物件或方法)時,這個類始終都能表現出正確的行為,那麼這個類(物件或方法)就是執行緒安全的.

synchronized:可以在任意物件或方法上加鎖,而加鎖的這段**稱為"互斥區"或"臨界區"

#**示例:

package com.thread.safety;

/** * 執行緒安全小例子:多個執行緒競爭問題

* @author lhy

* @time 2017.12.22

* */

public class mythread extends thread

/*** 執行機制分析:當多個執行緒訪問mythread的run方法時,以排隊的方式進行處理(這裡排隊是按照cpu分配的先後順序而定的)

* 乙個執行緒想要執行synchronized修飾的方法裡的**:

* 1.嘗試獲得鎖

* 2.如果拿到鎖,執行synchronized**體內容;拿不到鎖,這個執行緒就會不斷地嘗試獲得這把鎖,直至拿到為止

* 而且是多個執行緒同時去競爭這把鎖(也就是會產生鎖競爭的問題)

* @param args

*/public static void main(string args)

}

#**分析:

當多個執行緒訪問mythread的run方法時,以排隊的方式進行處理(這裡排隊是按照cpu分配的先後順序而定的) ,乙個執行緒想要執行synchronized修飾的方法裡的**,首先是嘗試獲得鎖,如果拿到鎖,執行synchronized**體內容;拿不到鎖,這個執行緒就會不斷地嘗試獲得這把鎖,直至拿到為止,而且是多個執行緒同時去競爭這把鎖(也就是會產生鎖競爭的問題)

2.多個執行緒多個鎖問題

概念:多個執行緒,每個執行緒都可以拿到自己指定的鎖,分別獲得鎖之後,執行synchronized方法體的內容

#**示例

package com.thread.safety;

/** * 多個執行緒多個鎖問題

* * @author lhy

* @time 2017.12.22

* */

public class multithread else

system.out.println("tag" + tag + ", num = " + num);

} catch (interruptedexception e) }

//注意觀察run方法輸出順序

public static void main(string args)

});thread t2 = new thread(new runnable()

});t1.start();

t2.start();

}}

#**分析:

關鍵字synchronized取得的鎖都是物件鎖,而不是把一段**(方法)當做鎖,所以示例**中哪個執行緒先執行synchronized關鍵字的方法,哪個執行緒就持有該方法所屬物件的的鎖(lock).兩個物件,執行緒獲得的就是兩個不同的鎖,他們互不影響.

有一種情況則是相同的鎖:即在靜態方法上加synchronized關鍵字,表示鎖定.class類,類一級別的鎖(獨佔.class類)

Java併發程式設計 單例模式執行緒安全問題

單例模式是指對乙個物件進行一次例項化,然後全域性都可以呼叫該例項化物件來完成專案的開發。在計算機系統中,執行緒池 快取 日誌物件 對話方塊 印表機 顯示卡的驅動程式物件常被設計成單例。這些應用都或多或少具有資源管理器的功能。每台計算機可以有若干個印表機,但只能有乙個printer spooler,以...

高併發執行緒安全問題

高併發執行緒 1 當多個執行緒訪問同乙個共享物件時,就是高併發執行緒。如,天貓雙十一等。因為執行緒的排程是搶占式的,當乙個執行緒在訪問共享資料 可以是多行 也可以是成員變數 時,其他執行緒也參與了該共享資料的運算,就會造成資料汙染,即執行緒安全 a 可見性 當多條執行緒在運算同一共享資料時,某條執行...

併發程式設計專題(一) 執行緒安全問題

當多個執行緒同時共享,同乙個全域性變數或靜態變數,做寫的操作時,可能會發生資料衝突問題,也就是執行緒安全問題。但是做讀操作是不會發生資料衝突問題。案例 需求現在有100張火車票,有兩個視窗同時搶火車票,請使用多執行緒模擬搶票效果。public class threadtrain implements...