導航不迷路:
程式、程序以及執行緒的愛恨情仇
最簡單實現多執行緒的方法(thread)
簡單易懂的多執行緒(通過實現runnable介面實現多執行緒)
常用獲取執行緒基本資訊的方法(新手專屬)
多執行緒,你覺得你安全了?(執行緒安全問題)
つづく…
多執行緒分享資源優點是速度快,但是會出現安全問題;那怎麼辦解決呢?一首打油詩送給您;
救線吟多執行緒,享資源;
安全問題,據錯亂;
不要急,莫要亂;
執行緒同步,把鎖看;
執行緒同步其實就是一種等待機制,多個需要同時訪問此物件的執行緒進入這個物件的等待池形成佇列,等待前面的執行緒使用完畢後,下乙個執行緒再使用。
通過在方法宣告中加入 synchronized 關鍵字來宣告,語法如下:
public synchronized void accessval(int newval);
原理synchronized 方法控制對「物件的類成員變數」的訪問:每個物件對應一把鎖,每個synchronized 方法都必須獲得呼叫該方法的物件的鎖方能執行,否則所屬執行緒阻塞,方法一旦執行,就獨佔該鎖,直到從該方法返回時才將鎖釋放,此後被阻塞的執行緒方能獲得該鎖,重新進入可執行狀態。
缺點若將乙個大的方法宣告為 synchronized 將會大大影響效率;
案例:設計乙個火車售票模擬程式;假如只剩五張票,三個視窗同時售票,每個視窗都有100人在排隊;
車票類**
public
class
ticket4
implements
runnable
}private
synchronized
void
saleticket()
catch
(interruptedexception e)
system.out.
println
(thread.
currentthread()
.getname()
+"正在賣第"
+ticket--
+"張票");}}}
測試類
public
class
testticket4
}
執行結果cpu太偏心了,就讓a出風頭!
通過 synchronized 關鍵字來宣告 synchronized 塊,語法如下:
synchronized(syncobject)
優點對於synchronized方法的缺點,synchronized塊便可解決;
synchronized塊可以精確地控制到具體的「成員變數」,縮小同步範圍,提高效率;
建議synchronized(syncobject){}中的syncobject物件又名:同步監視器;
同步監視器只能是物件,推薦使用共享資源的物件,可以是當前物件this,也可以是其他的共享物件;
案例:設計乙個火車售票模擬程式;假如只剩五張票,三個視窗同時售票,每個視窗都有100人在排隊;
車票類**
public
class
ticket3
implements
runnable
catch
(interruptedexception e)
system.out.
println
(thread.
currentthread()
.getname()
+"正在賣"
+ticket+
"張票");
} ticket--;}}}}
測試類
public
class
testticket3
}
執行結果只能說a是cpu的菜!
多執行緒 使用鎖編寫執行緒安全的程式
對上乙個例子的改進。1 競爭資源 public class student2 設定物件和獲取物件的執行緒 為了展示效果,我們使用了迴圈。public class setthread implements runnable override public void run else x public ...
Java多執行緒中線程安全與鎖問題
無狀態的物件一定是執行緒安全的。要保持狀態的一致性,就需要在單個原子操作中更新所有相關的狀態變數。併發環境中的原子性與事務應用程式中的原子性有著相同的含義 一組語句作為乙個不可分割的單元被執行。對於可能被多個執行緒同時訪問的可變狀態變數,在訪問它的時候需要持有同一把鎖,在這種情況下,稱狀態變數是由這...
多執行緒安全無鎖訊息佇列
技術介紹 cas 原子操作 是有cpu提供的原子操作。mydeque 入隊操作 void enqueue t value 通過援助操作,更新tail cas tail,tail,tail next 出對操作 t dequeue t temvalue q value recycle q 空間 retu...