2017-05-24 12 views
1

有人問我一個編碼採訪時這樣的問題,一個Java對象同步:如何使用〜100個原始域

假設你有一臺Linux機器上運行多個Java服務 - 這將是同步的一個好辦法這些服務之間具有〜100個原始字段的Java對象實時?提供至少兩種解決方案,並比較每種解決方案的優缺點。

併發並不是我最強烈的觀點,所以深入的解釋將不勝感激。提前致謝!

+0

作爲旁註:實時Java需要一個實時JVM,如[JamaicaVM](https://www.aicas.com/cms/en/JamaicaVM)。我也不知道原始字段與實際問題有什麼關係。我想說你需要更多的信息(例如誰寫/讀什麼)。 – beatngu13

回答

0

一種方式做到這一點是做對的字段級別的同步,但是這意味着你將有相應的對象到您的原語鎖定機制(例如使用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實例)上的鎖,而是同步每個私有對象上完成(字段),以便在嘗試在同一個字段上操作時線程只會被阻塞。

0

我並不是說這是「最好」的方法,但一種選擇是將對象持久化到數據庫並讓服務讀/寫。

使用像Hibernate這樣的ORM庫,您可以使用@Version批註並定義一個版本字段,以確保服務在更新之前需要具有最新版本的對象。你也可以使用數據庫鎖定。

在利弊方面,你需要考慮:

  • 請問這個解決方案工作做好時,有大量的併發寫入?
  • 當有大量併發讀取但寫入不多時,此解決方案是否能正常工作?
  • 當大多數寫入包含對對象字段的許多變化時,此解決方案是否可以正常工作?
  • 當大多數寫入包含對單個字段的更改時,此解決方案是否可以正常工作?
  • 服務需要多長時間才能鎖定對象?

你應該考慮在Hibernate的可用討論時,你的答案

相關問題