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()方法。
答案 0 :(得分:0)
行为是不确定的。有时克隆将在(2)处的更改之前包含字段的副本,有时克隆将包含(2)处的更改之后的字段的副本,有时它可能仅包含(2)处的一些更改。
在Semaphore或类似情况下使用,以确保行为确定。