【发布时间】:2018-10-17 11:29:09
【问题描述】:
我读过很多关于线程安全的文章。在我的多线程程序的某些部分,我更喜欢尝试不变性。在得到不正确的结果后,我注意到我的不可变对象不是线程安全的,尽管它是 100% 不可变的。如果我错了,请纠正我。
public final class ImmutableGaugeV4 {
private final long max, current;
public ImmutableGaugeV4(final long max) {
this(max, 0);
}
private ImmutableGaugeV4(final long max, final long current) {
this.max = max;
this.current = current;
}
public final ImmutableGaugeV4 increase(final long increament) {
final long c = current;
return new ImmutableGaugeV4(max, c + increament);
}
public final long getCurrent() {
return current;
}
public final long getPerc() {
return current * 100 / max;
}
@Override
public final String toString() {
return "ImmutableGaugeV4 [max=" + max + ", current=" + current + "](" + getPerc() + "%)";
}
}
啊啊啊
public class T4 {
public static void main(String[] args) {
new T4().x();
}
ImmutableGaugeV4 g3 = new ImmutableGaugeV4(10000);
private void x() {
for (int i = 0; i < 10; i++) {
new Thread() {
public void run() {
for (int j = 0; j < 1000; j++) {
g3 = g3.increase(1);
System.out.println(g3);
}
}
}.start();
}
}
}
有时我得到正确的结果,但大多数时候我不是
ImmutableGaugeV4 [max=10000, current=9994](99%)
ImmutableGaugeV4 [max=10000, current=9995](99%)
ImmutableGaugeV4 [max=10000, current=9996](99%)
ImmutableGaugeV4 [max=10000, current=9997](99%)
这个不可变对象有什么问题?在不使用内部锁的情况下使其线程安全缺少什么?
【问题讨论】:
-
你的班级
T4不是一成不变的。这就是您通过重新分配g3来改变的内容。 -
你有什么问题??你产生了 4 个不同的不可变对象。它与线程安全无关。我很惊讶有人甚至对此表示赞同
标签: java multithreading thread-safety immutability