Calendar Object Clone方法

时间:2014-05-22 03:01:30

标签: java calendar

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)处的cal对象上调用clone(),同时如果在(2)处更改cal的状态,则克隆将如何表现。就像一个线程正在克隆日历对象的字段,如果其他线程正在写入同一个日历对象,这会导致一个不一致的Calendar对象。

我如何处理此类情景?

主方法中的线程创建只是一个例子,客户端代码通常会调用setCalendar()方法。

1 个答案:

答案 0 :(得分:0)

行为是不确定的。有时克隆将在(2)处的更改之前包含字段的副本,有时克隆将包含(2)处的更改之后的字段的副本,有时它可能仅包含(2)处的一些更改。

Semaphore或类似情况下使用,以确保行为确定。