多執行緒別怕,有鎖就安全 (解決執行緒安全問題)

2021-10-12 22:03:17 字數 2435 閱讀 7488

導航不迷路:

程式、程序以及執行緒的愛恨情仇

最簡單實現多執行緒的方法(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...