2014-05-22 9 views
0
public class CalendarTest { 

    private Calendar cal; 

    public void setCalendar(Calendar cal){ 
     this.cal = (Calendar) cal.clone(); (1) 
    } 

    public static void main(String args[]){ 
     CalendarTest obj = new CalendarTest(); 
     Calendar cal = new GregorianCalendar(); 
     new Thread(new Runnable() { 

      @Override 
      public void run() { 
       //cal.setSomething; (2) 

      } 
     }).start(); 
     obj.setCalendar(cal); 
    } 
} 

클론()에서 칼 객체에서 호출 (1)과 칼의 상태가 (2), 어떻게 것이다 복제 동작합니다 변경할 경우 같은 시간에. 1 개의 thread가 달력 객체의 필드를 복제하고있어, 다른 thread가 같은 달력 객체에의 기입을 실시하고있는 경우, 결과적으로 일관성이없는 Calendar 객체가 발생합니다.달력 개체 복제 방법

어떻게 이런 종류의 시나리오를 처리 할 수 ​​있습니까?

주 메소드의 스레드 작성은 예제 일 뿐이지 만 클라이언트 코드는 일반적으로 setCalendar() 메소드를 호출합니다.

+1

정의되지 않았으므로 pickedup이 먼저 들어갑니다. –

답변

0

이 동작은 비 결정적입니다. 경우에 따라 복제본에 (2)에서 변경 사항이 적용되기 전에 필드 복사본이 포함되는 경우가 있으며 복제본에는 (2)에서 변경된 후에 필드 사본이 포함되며 때로는 (2)에서 변경 사항 중 일부만 포함될 수도 있습니다.

Semaphore 또는 이와 유사한 방법으로 행동 결정적으로 사용하십시오.