多執行緒處理之間昂貴物件建立互動

2021-09-01 13:37:34 字數 1520 閱讀 6965

工作中經常會遇到這樣的場景:一項複雜的工作耗費的時間比較長,為了避免重複這個過程,僅僅只需要乙個執行緒去做這個工作就好了,其他的執行緒等待這個執行緒的工作結果,有幾種方式可以實現這個模式,下面就總結了幾種方式然後分析他們之間的不同。

1通過future實現

基本**如下:

public class cachetest

result = dosomething();

cache.put(r, result);

return result;

}t dosomething()

}

需要注意的是需要重寫request 的hashcode和equals方法

採取了同步方法來避免多執行緒同時請求,但是問題對於整個方法的同步這個粒度較大,是靈活性不夠,其他的執行緒必須等待,下面有一種不用同步方法的實現方式。

class cachetest2

};futuretaskft = new futuretask(v);

f = cache.putifabsent(r, ft);

if(f == null)

}return f.get();

}t dosomething(request r)

}

第一條執行緒首先在快取中查詢是否有相應的物件(futuredata),如果不存在的話那這個執行緒就是第一條執行緒,是要去生產realdata的,他會繼續往下執行生產過程,

2物件鎖

基本原理是每條執行緒來的時候檢測快取彙總有沒有處理好的結果,或者是處理中的結果(使用臨時物件,如果是臨時物件,則執行緒會等待處理結果),第一條執行緒來將臨時物件放進快取,然後自己去生成真實的返回物件,整個工作完成後把真實物件放進快取,然後喚醒其他的執行緒。

class cachetest2 else if (value == pendinggenerationmarker)  catch (interruptedexception e) 

continue;

} else

} while (true);

}try catch (exception e) finally

}return value;

}object dosomething(request r)

}

這種方式比較靈活之處是在等待時間的處理方面,當等待時間超時後,邏輯處理可以返回null值,這樣等待執行緒可以繼續處理自己的其他邏輯,之後再回來檢視是否複雜物件已經生產完畢。

對於快取的結果資料如果較大,佔據記憶體空間很多時,又不想太麻煩寫乙個快取定時刪除機制,可以使用weakreference和softreference來實現。weakhashmap可以幫助實現這個功能。只需要將物件放入這個map,取出的時候首先取出reference 例項,然後取出真實的值:(reference) value).get()

在put的時候需要將值封裝為weakreference 的形式:

cache.put(key, new weakreference(value));

多執行緒之間同步

1 posix訊號量 includeint sem init sem t sem,int pshared,unsigned int value int sem destroy sem t sem int sem wait sem t sem sem trywait sem t sem int sem...

多執行緒之間通訊

多執行緒之間通訊,其實就是多個執行緒在操作同乙個資源,但是操作的動作不同。需求 第乙個執行緒寫入 input 使用者,另乙個執行緒取讀取 out 使用者.實現讀乙個,寫乙個操作。共享資源源實體類 class res輸入執行緒資源 class intthrad extends thread overr...

多執行緒之間通訊

多執行緒之間通訊 就是多個執行緒在操作同乙個資源,但是操作的動作不同 現在需要實現,生產一台電機,銷售一台電機問題。實現 執行結果 資料發生錯亂,造成執行緒安全問題 解決執行緒安全問題 通過wait notify來解決。wait和sleep的區別 wait可以指定時間也可以不指定時間,sleep必須...