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?