Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Use double-checked locking and volatile to make RecordHeader thread-safe.
This ensures that synchronization happens only during initialization, and once initialized, subsequent accesses do not acquire any locks.
Note that valueBuffer should also be declared volatile to reduce unnecessary synchronization attempts.

Before

Code Block
languagejava
titleRecordHeader Original
linenumberstrue
public class RecordHeader implements Header {
    private ByteBuffer keyBuffer;
    private String key;
    private ByteBuffer valueBuffer;
    private byte[] value;

...
    
    public String key() {
        if (key == null) {
            key = Utils.utf8(keyBuffer, keyBuffer.remaining());
            keyBuffer = null;
        }
        return key;
    }

    public byte[] value() {
        if (value == null && valueBuffer != null) {
            value = Utils.toArray(valueBuffer);
            valueBuffer = null;
        }
        return value;
    } 

...

Code Block
languagejava
titleRecordHeader Change
linenumberstrue
public class RecordHeader implements Header {
    private ByteBuffer keyBuffer;
    private volatile String key;
    private volatile ByteBuffer valueBuffer;
    private volatile byte[] value;

...

    public String key() {
        if (key == null) {
            synchronized (this) {
                if (key == null) {
                    key = Utils.utf8(keyBuffer, keyBuffer.remaining());
                    keyBuffer = null;
                }
            }
        }
        return key;
    }

    public byte[] value() {
        if (value == nulll && valueBuffer != null) {
                synchronized (this) {
                if (value == null && valueBuffer != null) {
                    value = Utils.toArray(valueBuffer);
                    valueBuffer = null;
                }
            }
        }
        return value;
    }
}

...