Я много читал о безопасности потоков.В определенной части моей многопоточной программы я предпочел попробовать неизменность.После получения неверных результатов я заметил, что мой неизменяемый объект не является потокобезопасным, хотя он неизменен на 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%)
Что не так с этим неизменным объектом?Чего не хватает, чтобы сделать его поточно-ориентированным без использования встроенных блокировок?