For educational purposes I'm writing a simple version of AtomicLong
, where an internal variable is guarded by ReentrantReadWriteLock
.
Here is a simplified example:
public class PlainSimpleAtomicLong {
private long value;
private final ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
public PlainSimpleAtomicLong(long initialValue) {
this.value = initialValue;
}
public long get() {
long result;
rwLock.readLock().lock();
result = value;
rwLock.readLock().unlock();
return result;
}
// incrementAndGet, decrementAndGet, etc. are guarded by rwLock.writeLock()
}
My question: since "value" is non-volatile, is it possible for other threads to observe incorrect initial value via PlainSimpleAtomicLong.get()
?
E.g. thread T1
creates L = new PlainSimpleAtomicLong(42)
and shares reference with a thread T2
. Is T2
guaranteed to observe L.get()
as 42?
If not, would wrapping this.value = initialValue;
into a write lock/unlock make a difference?