2009-05-02 114 views
9

所以可以说我有一个ň大小的服务器阵列设置像这样:兵马俑在这种情况下如何工作?

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)是在该客户端上的同步块(在Person.setObj(OtherObject)中):

1)直到所有N服务器在N大小的服务器阵列已与该Person.obj属性同步/更新?

2)直到 “活性” 服务器已与该更新属性Person.obj同步?那么阵列中的另一个(N-1)服务器是否尽可能同步?

3),我找过其他方法?

+0

只是FYI:在这种情况下的同步不做任何事情,因为引用的分配是原子的。 – cletus 2009-05-02 17:30:02

+0

我将它改为一个对象而不是字符串 – systemoutprintln 2009-05-02 21:13:10

回答

5

答案是没有真正1点或2的对象被跨服务器镜组条纹。首次设置此字段时,会创建一个事务,并且为该第一个事务选择的镜像组将在此之后“拥有”该对象。

对于1和2而言,并非所有活动的服务器组都需要更新,因此不需要等待这两种情况之一。

您可以在秦始皇文档的详细信息有关配置Terracotta服务器阵列:

从一个锁定点,这个人对象的集群锁将举行(跨群集互斥),同时执行对象修改。同步块的作用域构成了上面提到的事务。在getObj()方法中,您可以将其配置为读取锁定,从而允许跨集群的多个并发读取器。

0

我不熟悉他们的(兵马俑)实现,但从JMM的角度来看,它应该应该采取群集范围的锁。但是,这个例子非常简单;只是引用的改变,这可能会导致它被转换成更像是易失性写入的东西,并完全避免锁定。但是,如果你在你的同步块中做了非平凡的东西,那么我会假设TC在同步块的开始处悲观地采取了一个全局锁定。如果他们不这样做,他们会与JMM规范不一致。据我了解。

换句话说,您的选项#1。因此,要小心你在集群中共享的内容,并尽可能使用不可变对象和java.util.concurrent。*数据结构 - 后者在TC中获得特殊的内在爱。

相关问题