我对不可变对象有点傻。我的想法是它们在多线程环境中很有帮助,并且根据定义是线程安全的。
但是下面的代码似乎正好相反!
public class ImmutableTest {
volatile ImmutableObject obj;
public static void main(String[] args) throws InterruptedException {
new ImmutableTest().execute();
}
private void execute() throws InterruptedException
{
obj = new ImmutableObject(0);
ExecutorService exec = Executors.newFixedThreadPool(50);
for(int i = 0; i < 50; i++){
exec.execute(new ImmutableRunnable(this));
}
Thread.sleep(5000);
exec.shutdown();
obj.print();
}
}
public class ImmutableRunnable implements Runnable {
ImmutableTest test;
ImmutableRunnable(ImmutableTest immutableTest) {
this.test = immutableTest;
}
public void run() {
this.test.obj = new ImmutableObject(this.test.obj.getValue());
}
}
public final class ImmutableObject {
private int n;
public ImmutableObject(int newValue) {
this.n = newValue;
if(Math.random() > .5){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void print() {
System.out.println(n);
}
public int getValue() {
return n;
}
}
在线程安全的环境中,我预计结果为 50。但这种情况并非如此。如果您从 ImmutableObject 构造函数中取消随机睡眠,您将获得 50。
那么结论是什么?不可变对象是线程安全的“如果构造函数足够快”?或者(更有可能)我误解了什么?
抱歉,我没有正确解释我的疑问。这不是一个同步问题,我学习了如何同步方法和使用锁。这个问题涉及不可变对象及其与多线程的关系。我到处读到不可变对象是线程安全的,因此它可以在线程之间共享而无所畏惧。但恕我直言,这根本不是真的!!!那么您能否提供一个示例,其中不可变对象在不同线程之间共享并且它的使用不需要同步?多谢你们。