import java.lang.invoke.MethodHandles;
import java.lang.invoke.VarHandle;
class SimulateCAS {
private volatile int count;
private static final VarHandle COUNT;
static {
try {
COUNT = MethodHandles.lookup().findVarHandle(SimulateCAS.class, "count", int.class);
}
}
private int cas(int expectation, int newValue) {
return (int) COUNT.compareAndExchange(this, expectation, newValue);
}
void add10k() {
int oldValue, newValue;
do {
oldValue = count;
newValue = oldValue + 1; // ?
} while (oldValue != cas(oldValue, newValue)); // ?
}
final SimulateCAS demo = new SimulateCAS();
for (int i = 0; i < 10000; i++) {
demo.add10k();
}
});
for (int i = 0; i < 10000; i++) {
demo.add10k();
}
});
t1.start();
t2.start();
t1.join();
t2.join();
System.
out.
println(demo.
count); }
}
aW1wb3J0IGphdmEubGFuZy5pbnZva2UuTWV0aG9kSGFuZGxlczsKaW1wb3J0IGphdmEubGFuZy5pbnZva2UuVmFySGFuZGxlOwoKY2xhc3MgU2ltdWxhdGVDQVMgewogICAgcHJpdmF0ZSB2b2xhdGlsZSBpbnQgY291bnQ7CiAgICAKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFZhckhhbmRsZSBDT1VOVDsKICAgIHN0YXRpYyB7CiAgICAJdHJ5IHsKCQkJQ09VTlQgPSBNZXRob2RIYW5kbGVzLmxvb2t1cCgpLmZpbmRWYXJIYW5kbGUoU2ltdWxhdGVDQVMuY2xhc3MsICJjb3VudCIsIGludC5jbGFzcyk7CgkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gfCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKCQkJdGhyb3cgbmV3IEVycm9yKGUpOwoJCX0KICAgIH0KCiAgICBwcml2YXRlIGludCBjYXMoaW50IGV4cGVjdGF0aW9uLCBpbnQgbmV3VmFsdWUpIHsKICAgICAgICByZXR1cm4gKGludCkgQ09VTlQuY29tcGFyZUFuZEV4Y2hhbmdlKHRoaXMsIGV4cGVjdGF0aW9uLCBuZXdWYWx1ZSk7CiAgICB9CgogICAgdm9pZCBhZGQxMGsoKSB7CiAgICAgICAgaW50IG9sZFZhbHVlLCBuZXdWYWx1ZTsKICAgICAgICBkbyB7CiAgICAgICAgCW9sZFZhbHVlID0gY291bnQ7CiAgICAgICAgICAgIG5ld1ZhbHVlID0gb2xkVmFsdWUgKyAxOyAgICAgICAgICAgICAgICAgICAgICAgLy8gPwogICAgICAgIH0gd2hpbGUgKG9sZFZhbHVlICE9IGNhcyhvbGRWYWx1ZSwgbmV3VmFsdWUpKTsgICAgICAgIC8vID8KICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewogICAgICAgIGZpbmFsIFNpbXVsYXRlQ0FTIGRlbW8gPSBuZXcgU2ltdWxhdGVDQVMoKTsKICAgICAgICBUaHJlYWQgdDEgPSBuZXcgVGhyZWFkKCgpIC0+IHsKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwMDsgaSsrKSB7CiAgICAgICAgICAgICAgICBkZW1vLmFkZDEwaygpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgVGhyZWFkIHQyID0gbmV3IFRocmVhZCgoKSAtPiB7CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDA7IGkrKykgewogICAgICAgICAgICAgICAgZGVtby5hZGQxMGsoKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICB0MS5zdGFydCgpOwogICAgICAgIHQyLnN0YXJ0KCk7CiAgICAgICAgdDEuam9pbigpOwogICAgICAgIHQyLmpvaW4oKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZGVtby5jb3VudCk7CiAgICB9Cn0=