對上乙個例子的改進。
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變數從執行緒的工作記憶體寫回到...