문제

그래서 내가 가지고 있다고 가정 해 봅시다 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 루트 (데이터 구조)의 개인 개체에서 SetObj (기타 개체)를 호출하는 경우 동기화 된 블록 (직원으로.

1) 전부까지 N 서버의 N 크기의 서버 배열은 해당 Person.obj 속성과 동기화/업데이트 되었습니까?

또는

2) "활성"서버가 해당 업데이트 된 사람과 동기화 될 때까지? 그런 다음 다른 (N-1) 배열의 서버가 가능한 한 동기화됩니까?

또는

3) 내가보고있는 다른 방법?

도움이 되었습니까?

해결책

대답은 실제로 1 또는 2가 아닙니다. 객체는 서버 미러 그룹을 가로 질러 줄무늬가 있습니다. 이 필드가 처음 설정되면 거래가 생성되며 해당 첫 거래를 위해 선택된 미러 그룹은 그 후 객체를 "소유"합니다.

1과 2와 관련하여 모든 활성 서버 그룹을 업데이트 할 필요는 없으므로 해당 조건 중 하나를 기다릴 필요가 없습니다.

Terracotta Server 배열 구성에 대한 Terracotta 문서에서 추가 정보를 찾을 수 있습니다.

잠금 관점에서,이 사람 객체의 클러스터 잠금 잠금 장치는 객체 수정을 수행하는 동안 (클러스터를 가로 질러 상호 배제) 유지됩니다. 동기화 된 블록의 범위는 위에서 언급 한 트랜잭션을 형성합니다. getObj () 메소드에서는 클러스터 전체에서 여러 동시 독자를 허용하는 읽기 잠금으로 구성 할 수 있습니다.

다른 팁

다른 사람들이 당신의 대상에 대한 참조를 가지고 있고 당신이하기 전/후에/후에 만질 수 있다고 가정하십시오. 따라서 솔루션은 잠금 장치를 추가하는 것입니다.

  • 잠금을 얻으십시오
  • 객체를 수정하십시오
  • 릴리스 잠금

그리고 그것이 바로 무엇입니다 동기화 그렇게 ... 대기열과 the를 만듭니다 동기화 된 방법 두 번 이상 호출 할 수는 없지만 ... 어딘가에 참조되면 근본적인 물체에 닿을 수 있습니다.

보다:

나는 그들의 (테라코타) 구현에 익숙하지 않지만 JMM 관점에서 ~해야 한다 클러스터 전체 잠금 장치를 사용하십시오. 그러나이 예는 매우 간단합니다. 단지 참조의 변경으로 인해 휘발성 쓰기와 비슷한 것으로 변환 될 수 있으며 잠금을 완전히 피할 수 있습니다.

그러나 동기화 된 블록에서 사소한 작업을 수행하면 TC가 동기화 된 블록의 시작 부분에서 비관적으로 클러스터 전체 잠금을 취한다고 가정합니다. 그렇지 않은 경우 JMM 사양과 상충됩니다. 내가 이해하면서.

다시 말해, 옵션 #1. 따라서 클러스터에서 공유하는 것을 조심하고 불변의 물체와 java.util.concurrent를 사용하십시오.* 가능한 경우 데이터 구조 - 후자는 TC에서 특별한 본질적인 사랑을 얻고 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top