簡體   English   中英

兵馬俑是如何在這種情況下工作的?

[英]How does Terracotta work in this situation?

所以假設我有一個N大小的服務器陣列設置如下:

alt text http://www.terracotta.org/web/download/attachments/43909161/ServerArrayMirrorGroup.png

我有一個簡單的JavaBean / POJO:

package example;

public class Person {
  private OtherObject obj;

  public void setObj(OtherObject theObj) {
    synchronized (this) {
      obj = theObj;
    }
  }

  public OtherObject getObj() {
    synchronized (this) {
      return obj;
    }
  }
}

現在,如果其中一個客戶端在TC根(數據結構)中的Person對象上調用Person.setObj(OtherObject),則該客戶端上的synchronized塊 (在Person.setObj(OtherObject)中)是否保持:

1)在使用該Person.obj屬性同步/更新N大小的服務器陣列中的所有N個服務器之前?

要么

2)直到“活動”服務器與更新的Person.obj屬性同步? 那么陣列中的其他( N-1 )服務器是否盡可能同步?

要么

3)我在看的其他一些方法?

答案實際上不是1或2.對象在服務器鏡像組中是條帶化的。 第一次設置此字段時,將創建一個事務,並為該第一個事務選擇的鏡像組將在此之后“擁有”該對象。

對於1和2,並非所有活動服務器組都需要更新,因此不需要等待這些條件中的任何一個。

您可以在Terracotta文檔中找到有關配置Terracotta服務器陣列的更多信息:

從鎖定的角度來看,在執行對象修改時,將保留此Person對象上的群集鎖(跨群集互斥)。 synchronized塊的范圍形成上述事務。 在getObj()方法中,您可以將其配置為讀鎖,以允許跨群集的多個並發讀取器。

假設其他人都有對您的對象的引用,並且可以在/之前/之后觸摸它。 因此,解決方案是添加鎖,和

  • 獲得鎖定
  • 修改對象
  • 解鎖

而這正是同步所做的......它創建了一個隊列, 同步方法不能被多次調用......但如果在某處引用了底層對象,則可能會觸及它。

看到:

我不熟悉他們的(Terracotta)實現,但從JMM的角度來看,它應該采用群集范圍的鎖定。 但是,這個例子非常簡單; 只是更改引用,這可能會導致它轉換為更像是易失性寫入的內容,並完全避免鎖定。

但是,如果你在同步塊中做了非平凡的事情,那么我會假設TC在同步塊的開始處悲觀地采取了一個cluser-wide鎖。 如果他們沒有,他們將與JMM規格不一致。 據我了解。

換句話說,您的選項#1。 所以,要小心你在集群中分享的內容,並且盡可能使用不可變對象和java.util.concurrent。*數據結構 - 后者在TC中獲得特殊的內在愛。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM