多執行緒 使用鎖編寫執行緒安全的程式

2021-07-15 12:11:04 字數 1536 閱讀 3722

對上乙個例子的改進。

1、競爭資源

public

class student

2、設定物件和獲取物件的執行緒

為了展示效果,我們使用了迴圈。

public

class

setthread

implements

runnable

@override

public

void

run() else

x++;}}

}}

public

class

getthread

implements

runnable

@override

public

void

run() }}

}

3、測試方法

注意事項:鎖物件,要是同一把,才能「鎖」住。如果是不同的鎖,鎖的意義就不大了,鎖物件可以是任意的物件。

我們這裡使用的鎖物件是 student 物件。

/**

* created by liwei on 16/7/18.

*//*

* 分析:

* 資源類:student

* 設定學生資料:setthread(生產者)

* 獲取學生資料:getthread(消費者)

* 測試類:studentdemo

* * 問題1:按照思路寫**,發現資料每次都是:null---0

* 原因:我們在每個執行緒中都建立了新的資源,而我們要求的時候設定和獲取執行緒的資源應該是同乙個

* 如何實現呢?

* 在外界把這個資料建立出來,通過構造方法傳遞給其他的類。

* * 問題2:為了資料的效果好一些,我加入了迴圈和判斷,給出不同的值,這個時候產生了新的問題

* a:同乙個資料出現多次

* b:姓名和年齡不匹配

* 原因:

* a:同乙個資料出現多次

* cpu的一點點時間片的執行權,就足夠你執行很多次。

* b:姓名和年齡不匹配

* 執行緒執行的隨機性

* 執行緒安全問題:

* a:是否是多執行緒環境 是

* b:是否有共享資料 是

* c:是否有多條語句操作共享資料 是

* 解決方案:

* 加鎖。

* 注意:

* a:不同種類的執行緒都要加鎖。

* b:不同種類的執行緒加的鎖必須是同一把。

*//**

* 本例子僅僅只是解決了安全的問題:解決辦法:加鎖

*/public

class

studentdemo

}

編寫安全的多執行緒C 程式

1 monitor類 主要是靜態方法 monitor.enter obj 獲得加在物件obj上的鎖 monitor.exit obj 釋放鎖 上面兩句之間的 相當於lock obj monitor.tryenter obj 該方法立即返回,如果返回值為false,則接下來不需要monitor.exi...

多執行緒 執行緒安全

原因 當多個執行緒同時共享,同乙個全域性變數或靜態變數。做寫的操作時,可能發生資料衝突問題,也就是執行緒安全問題。但是做讀操作是不會發生資料衝突問題。解決方案 方式一 內建鎖synchronized synchronized保證執行緒原子性,當執行緒進入方法的時候,自動獲取鎖,一旦鎖被其它執行緒獲取...

多執行緒 執行緒安全

public class unsafethread t.start while thread.activecount 1 system.out.println sum 1 從主記憶體中講sum變數複製到執行緒的工作記憶體 2 在工作記憶體中修改變數 1操作 3 將sum變數從執行緒的工作記憶體寫回到...