我需要實作一個執行緒安全的方法,該方法一次只能由一個執行緒執行,而當該方法被一個執行緒執行時,所有其他試圖執行同一方法的執行緒不應等待,必須退出該方法。
由于執行緒將按順序等待執行該方法,因此同步在這里沒有幫助。
我想通過使用下面的代碼,利用ConcurrentHashMap來實作這一目標,但不確定這是否是實作它的完美方式。
Class Test {
private ConcurrentHashMap<String, Object> map = new ConcurrentHashMap<> ()。
public void execute(){
if (map.putIfApsent("key", new Object()) !=null) { //map的key有值,這意味著一個執行緒已經進入了。
return; // early exit。
}
threadSafeMethod()。
map.remove("key")。
}
private void threadSafeMethod() {
//我的代碼。
}
}
uj5u.com熱心網友回復:
你可以在沒有同步的情況下,通過使用布林值進行比較和交換來實作:
private AtomicBoolean entered = new AtomicBoolean(false)。
public void execute() {
if( entered.compareAndSet(false,true) {
try {
方法()
} finally {
entered.set(false)
}
}
uj5u.com熱心網友回復:
你可以使用一個ReentrantLock并為等待時間指定一個負值。在這種情況下,如果有一個執行緒已經在執行該代碼,調度器將不會嘗試等待。
//將鎖定義在某處作為實體變數。
Lock lock = new ReentrantLock() 。
try {
var isAvailable = lock.tryLock(-1, TimeUnit.NANOSECONDS)。
if(isAvailable) {
System.out.println("do work")。
lock.unlock()。
}
} catch (InterruptedException e) {
e.printStackTrace()。
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/308320.html
標籤:
