Versions Compared

Key

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

...

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;
    } 

After

Code Block
languagejava
titleRecordHeader Change
linenumberstrue
public class RecordHeader implements Header {
    private ByteBuffer keyBuffer;
    private +   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 == null && valueBuffer != null) {
+            synchronized (this) {
 +               if (value == null && valueBuffer != null) {
                    value = Utils.toArray(valueBuffer);
                    valueBuffer = null;
+                }
 +           }
        }
        return value;
    }
}

JMH Benchmark: Double-Checked Locking vs. Full-Method Synchronization

...