Mercurial > hg > openjdk > jdk8u > jaxp
changeset 1955:f64efeef405b
8212178: Soft reference reclamation race in com.sun.xml.internal.stream.util.ThreadLocalBufferAllocator
Reviewed-by: rkennke, kbarrett, joehw
author | shade |
---|---|
date | Wed, 06 Feb 2019 14:58:17 +0100 |
parents | 58a54ab25e52 |
children | 4a62904b0d7e |
files | src/com/sun/xml/internal/stream/util/ThreadLocalBufferAllocator.java |
diffstat | 1 files changed, 14 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/src/com/sun/xml/internal/stream/util/ThreadLocalBufferAllocator.java Tue Jan 15 10:46:35 2019 +0000 +++ b/src/com/sun/xml/internal/stream/util/ThreadLocalBufferAllocator.java Wed Feb 06 14:58:17 2019 +0100 @@ -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; + } }