8212178: Soft reference reclamation race in com.sun.xml.internal.stream.util.ThreadLocalBufferAllocator
Reviewed-by: rkennke, kbarrett, joehw
diff --git a/src/com/sun/xml/internal/stream/util/ThreadLocalBufferAllocator.java b/src/com/sun/xml/internal/stream/util/ThreadLocalBufferAllocator.java
index 25bdf6b..5f4243d 100644
--- a/src/com/sun/xml/internal/stream/util/ThreadLocalBufferAllocator.java
+++ b/src/com/sun/xml/internal/stream/util/ThreadLocalBufferAllocator.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -39,15 +39,19 @@
* @author Santiago.PericasGeertsen@sun.com
*/
public class ThreadLocalBufferAllocator {
- private static ThreadLocal tlba = new ThreadLocal();
+ private static final ThreadLocal<SoftReference<BufferAllocator>> TL = new ThreadLocal<>();
- public static BufferAllocator getBufferAllocator() {
- SoftReference bAllocatorRef = (SoftReference) tlba.get();
- if (bAllocatorRef == null || bAllocatorRef.get() == null) {
- bAllocatorRef = new SoftReference(new BufferAllocator());
- tlba.set(bAllocatorRef);
+ public static BufferAllocator getBufferAllocator() {
+ BufferAllocator ba = null;
+ SoftReference<BufferAllocator> sr = TL.get();
+ if (sr != null) {
+ ba = sr.get();
}
-
- return (BufferAllocator) bAllocatorRef.get();
- }
+ if (ba == null) {
+ ba = new BufferAllocator();
+ sr = new SoftReference<>(ba);
+ TL.set(sr);
+ }
+ return ba;
+ }
}