Java併發API中的幾個同步輔助類

2021-09-12 09:19:07 字數 3248 閱讀 9901

訊號量是乙個計數器,用來保護乙個或多個共享資源的訪問。當執行緒訪問乙個乙個共享資源時,它必須得先獲取訊號量,如果訊號量大於0,則訊號量減一,該執行緒允許訪問共享資源。當訊號量等於0,則執行緒將會被置於休眠,直到訊號量大於0

public

class

semaphoretest

/** * 新增

* @param d

*/public

void

add(double d)

thread.

sleep

(1000);

system.out.

println

(thread.

currentthread()

.getname()

+": add end");

}catch

(interruptedexception e)

finally

}/**

* 獲取

*/public double get()

thread.

sleep

(1000);

system.out.

println

(thread.

currentthread()

.getname()

+": get end");

return d;

}catch

(interruptedexception e)

finally

}public

static

void

main

(string[

] args)})

.start()

;}for(

int i =

0; i <

3; i++)}

).start()

;}}}

public

class

countdownlatchtest

finally

// 等待其他執行緒準備

latch.

await()

; system.out.

println

(thread.

currentthread()

.getname()

+": 準備完成, 開始執行任務...");

}catch

(interruptedexception e)})

.start()

;}}}

public

class

cyclicbarrierstudy}}

// 列印正確結果資訊,用於後面的校驗

system.out.

printf

("需查詢的數值 %d 共出現 %d 次發\n"

, number, count);}

public

int[

]getdata

(int index)

public

static

void

main

(string[

] args)

system.out.

printf

("查詢結束,數值 %d 共出現 %d 次\n"

, number, count);}

);// 用執行緒計算每組的出現的數量

for(

int i =

0; i < size; i++)}

// 儲存該組陣列**現指定資料的次數

countdata[index]

= count;

system.out.

println

(thread.

currentthread()

.getname()

+" search end");

trycatch

(interruptedexception

| brokenbarrierexception e)})

.start()

;}}}

phaser示例,控制各階段的同步

public

class

phasertest

}for

(int i =

0; i < len; i++

)else

system.out.

println

(thread.

currentthread()

.getname()

+": 開始第三階段");

system.out.

println

(thread.

currentthread()

.getname()

+": "

+ arrays.

tostring

(data[index]))

;}).

start()

;}}}

public

class

exchangertest

static

class

producer

implements

runnable

@override

public

void

run(

)catch

(interruptedexception e)

system.out.

println

("消費者現有資料數量: "

+ data.

size()

);index++;}

}}static

class

consumer

implements

runnable

@override

public

void

run(

)catch

(interruptedexception e)

system.out.

println

("消費的資料: "

+ data.

poll()

);index++;}

}}}

java併發程式設計 執行緒同步

sysynchronized關鍵字可以修飾方法 塊,但不能修飾構造器 成員變數等。當sysynchronized關鍵字同來修飾方法和 塊時,能夠保證同一時刻最多只有乙個執行緒執行該段 或方法。防止當有兩個執行緒併發修改同乙個檔案時可能會造成異常。同步 塊語法 synchronized obj 複製 ...

併發技術中同步

如果程式中用到了併發技術,一段 需要修改資料,同時其他 需要訪問同一資料。同步的型別 a.通訊 b.資料保護。如果以下三個條件都滿足,就需要使用同步來保護資料。多個執行緒需要安全的讀寫共享資料。乙個執行緒進入鎖後,在鎖被釋放之前,其他執行緒是無法進入的。鎖的使用,有四條重要的規則 首先,要盡量限制鎖...

JAVA 併發程式設計 同步工具類

countdownlatch 閉鎖 閉鎖是一種同步工具類,可以延遲線程的進度知道其到達終止狀態。閉鎖的作用相當於一扇門 await 在閉鎖到達結束狀態之前,這扇門一直是關閉的,不允許任何執行緒通過,當到達結束狀態時 所有執行緒均到達countdown 這扇門會開啟並且允許所有的執行緒通過。而且,當門...