有人問我一個編碼採訪時這樣的問題,一個Java對象同步:如何使用〜100個原始域
假設你有一臺Linux機器上運行多個Java服務 - 這將是同步的一個好辦法這些服務之間具有〜100個原始字段的Java對象實時?提供至少兩種解決方案,並比較每種解決方案的優缺點。
併發並不是我最強烈的觀點,所以深入的解釋將不勝感激。提前致謝!
有人問我一個編碼採訪時這樣的問題,一個Java對象同步:如何使用〜100個原始域
假設你有一臺Linux機器上運行多個Java服務 - 這將是同步的一個好辦法這些服務之間具有〜100個原始字段的Java對象實時?提供至少兩種解決方案,並比較每種解決方案的優缺點。
併發並不是我最強烈的觀點,所以深入的解釋將不勝感激。提前致謝!
一種方式做到這一點是做對的字段級別的同步,但是這意味着你將有相應的對象到您的原語鎖定機制(例如使用Integer
而不是int
)。所以,您的實現看起來是這樣的:
public class SomeSynchronizedClass {
private Integer field1;
private Double field2;
....
public void doSomethingWithField1() {
synchronized(field1) {
// do something to field1 here
}
}
public void doSomethingWithField2() {
synchronized(field2) {
// do something to field2 here
}
}
}
注意,這個方法是不同步的,因爲這將持有的對象本身(的SomeSynchronizedClass
實例)上的鎖,而是同步每個私有對象上完成(字段),以便在嘗試在同一個字段上操作時線程只會被阻塞。
我並不是說這是「最好」的方法,但一種選擇是將對象持久化到數據庫並讓服務讀/寫。
使用像Hibernate這樣的ORM庫,您可以使用@Version
批註並定義一個版本字段,以確保服務在更新之前需要具有最新版本的對象。你也可以使用數據庫鎖定。
在利弊方面,你需要考慮:
你應該考慮在Hibernate的可用討論時,你的答案
作爲旁註:實時Java需要一個實時JVM,如[JamaicaVM](https://www.aicas.com/cms/en/JamaicaVM)。我也不知道原始字段與實際問題有什麼關係。我想說你需要更多的信息(例如誰寫/讀什麼)。 – beatngu13