我有一个类似于以下类的静态数组:
public class Entry {
private String sharedvariable1= "";
private String sharedvariable2= "";
private int sharedvariable3= -1;
private int mutablevariable1 = -1
private int mutablevariable2 = -2;
public Entry (String sharedvariable1,
String sharedvariable2,
int sharedvariable3) {
this.sharedvariable1 = sharedvariable1;
this.sharedvariable2 = sharedvariable2;
this.sharedvariable3 = sharedvariable 3;
}
public Entry (Entry entry) { //copy constructor.
this (entry.getSharedvariable1,
entry.getSharedvariable2,
entry.getSharedvaraible3);
}
....
/* other methods including getters and setters*/
}
在我的程序中的某个时刻,我访问了这个对象的一个实例,并使用上面的复制构造函数制作了一个副本。然后我更改上面两个可变变量的值。该程序在多线程环境中运行。 请注意。所有变量都在线程化之前设置了它们的初始值。 只有在程序线程化后,才会创建一个副本,变量才会更改。我相信它是线程安全的,因为我只读取静态对象,而不是写入它(即使是共享变量 3,尽管只读取 int 和 mutable)并且我只更改静态对象的副本(和正在线程内进行复制)。但是,我想在这里确认我的想法是正确的。
有人可以评价一下我在做什么吗?
最佳答案
它不是线程安全的。您需要包装任何修改共享变量的东西:
synchronized (this) {
this.sharedvariable1 = newValue;
}
对于 setter,你可以这样做:
public synchronized void setSharedvariable1(String sharedvariable1) {
this.sharedvariable1 = sharedvariable1;
}
然后在你的复制构造函数中,你会做类似的事情:
public Entry (Entry entry) {
this();
synchronized(entry) {
this.setSharedvariable1(entry.getSharedvariable1());
this.setSharedvariable2(entry.getSharedvariable2());
this.setSharedvariable3(entry.getSharedvariable3());
}
}
这确保如果正在对实例进行修改,则复制操作将等到修改完成。
关于java - Java 中对象的线程安全复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10191465/