From 7dba7005b79994106321b0f86bc8f4ea51a3c185 Mon Sep 17 00:00:00 2001 From: Colin Patrick Mccabe Date: Tue, 26 May 2015 12:15:46 -0700 Subject: [PATCH] HADOOP-11969. ThreadLocal initialization in several classes is not thread safe (Sean Busbey via Colin P. McCabe) --- .../main/java/org/apache/hadoop/io/MD5Hash.java | 3 ++- .../main/java/org/apache/hadoop/io/Text.java | 4 ++-- .../org/apache/hadoop/util/ReflectionUtils.java | 6 +++--- .../crypto/key/kms/server/KMSMDCFilter.java | 2 +- .../apache/hadoop/lib/servlet/ServerWebApp.java | 3 ++- .../org/apache/hadoop/test/TestDirHelper.java | 2 +- .../org/apache/hadoop/test/TestHdfsHelper.java | 4 ++-- .../org/apache/hadoop/test/TestJettyHelper.java | 2 +- .../org/apache/hadoop/mapred/lib/Chain.java | 2 +- .../hadoop/mapred/pipes/PipesPartitioner.java | 6 +++--- .../task/reduce/ShuffleSchedulerImpl.java | 7 ++++--- .../apache/hadoop/tools/util/DistCpUtils.java | 2 +- .../apache/hadoop/record/BinaryRecordInput.java | 7 ++++--- .../hadoop/record/BinaryRecordOutput.java | 17 +++++++++-------- .../hadoop/typedbytes/TypedBytesInput.java | 8 +++++--- .../hadoop/typedbytes/TypedBytesOutput.java | 8 +++++--- .../typedbytes/TypedBytesRecordInput.java | 8 +++++--- .../typedbytes/TypedBytesRecordOutput.java | 8 +++++--- .../typedbytes/TypedBytesWritableInput.java | 8 +++++--- .../typedbytes/TypedBytesWritableOutput.java | 8 +++++--- 20 files changed, 66 insertions(+), 49 deletions(-) diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/MD5Hash.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/MD5Hash.java index 87c89824a6a..822e0894b23 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/MD5Hash.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/MD5Hash.java @@ -35,7 +35,8 @@ public class MD5Hash implements WritableComparable { public static final int MD5_LEN = 16; - private static ThreadLocal DIGESTER_FACTORY = new ThreadLocal() { + private static final ThreadLocal DIGESTER_FACTORY = + new ThreadLocal() { @Override protected MessageDigest initialValue() { try { diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/Text.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/Text.java index a9c64ef9450..3ab327fe76a 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/Text.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/Text.java @@ -53,7 +53,7 @@ public class Text extends BinaryComparable implements WritableComparable { - private static ThreadLocal ENCODER_FACTORY = + private static final ThreadLocal ENCODER_FACTORY = new ThreadLocal() { @Override protected CharsetEncoder initialValue() { @@ -63,7 +63,7 @@ protected CharsetEncoder initialValue() { } }; - private static ThreadLocal DECODER_FACTORY = + private static final ThreadLocal DECODER_FACTORY = new ThreadLocal() { @Override protected CharsetDecoder initialValue() { diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/ReflectionUtils.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/ReflectionUtils.java index d9a73263d85..da14979a821 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/ReflectionUtils.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/ReflectionUtils.java @@ -264,7 +264,7 @@ void moveData() { /** * Allocate a buffer for each thread that tries to clone objects. */ - private static ThreadLocal cloneBuffers + private static final ThreadLocal CLONE_BUFFERS = new ThreadLocal() { @Override protected synchronized CopyInCopyOutBuffer initialValue() { @@ -289,7 +289,7 @@ private static SerializationFactory getFactory(Configuration conf) { @SuppressWarnings("unchecked") public static T copy(Configuration conf, T src, T dst) throws IOException { - CopyInCopyOutBuffer buffer = cloneBuffers.get(); + CopyInCopyOutBuffer buffer = CLONE_BUFFERS.get(); buffer.outBuffer.reset(); SerializationFactory factory = getFactory(conf); Class cls = (Class) src.getClass(); @@ -306,7 +306,7 @@ public static T copy(Configuration conf, @Deprecated public static void cloneWritableInto(Writable dst, Writable src) throws IOException { - CopyInCopyOutBuffer buffer = cloneBuffers.get(); + CopyInCopyOutBuffer buffer = CLONE_BUFFERS.get(); buffer.outBuffer.reset(); src.write(buffer.outBuffer); buffer.moveData(); diff --git a/hadoop-common-project/hadoop-kms/src/main/java/org/apache/hadoop/crypto/key/kms/server/KMSMDCFilter.java b/hadoop-common-project/hadoop-kms/src/main/java/org/apache/hadoop/crypto/key/kms/server/KMSMDCFilter.java index 2a3c14971b2..81591e57cde 100644 --- a/hadoop-common-project/hadoop-kms/src/main/java/org/apache/hadoop/crypto/key/kms/server/KMSMDCFilter.java +++ b/hadoop-common-project/hadoop-kms/src/main/java/org/apache/hadoop/crypto/key/kms/server/KMSMDCFilter.java @@ -49,7 +49,7 @@ private Data(UserGroupInformation ugi, String method, StringBuffer url) { } } - private static ThreadLocal DATA_TL = new ThreadLocal(); + private static final ThreadLocal DATA_TL = new ThreadLocal(); public static UserGroupInformation getUgi() { return DATA_TL.get().ugi; diff --git a/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/main/java/org/apache/hadoop/lib/servlet/ServerWebApp.java b/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/main/java/org/apache/hadoop/lib/servlet/ServerWebApp.java index cd1659383bb..c745f458366 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/main/java/org/apache/hadoop/lib/servlet/ServerWebApp.java +++ b/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/main/java/org/apache/hadoop/lib/servlet/ServerWebApp.java @@ -46,7 +46,8 @@ public abstract class ServerWebApp extends Server implements ServletContextListe private static final String HTTP_PORT = ".http.port"; public static final String SSL_ENABLED = ".ssl.enabled"; - private static ThreadLocal HOME_DIR_TL = new ThreadLocal(); + private static final ThreadLocal HOME_DIR_TL = + new ThreadLocal(); private InetSocketAddress authority; diff --git a/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/test/TestDirHelper.java b/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/test/TestDirHelper.java index d20658fe4e4..8eafbf82c6a 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/test/TestDirHelper.java +++ b/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/test/TestDirHelper.java @@ -89,7 +89,7 @@ private static void delete(File file) throws IOException { } } - private static ThreadLocal TEST_DIR_TL = new InheritableThreadLocal(); + private static final ThreadLocal TEST_DIR_TL = new InheritableThreadLocal(); @Override public Statement apply(final Statement statement, final FrameworkMethod frameworkMethod, final Object o) { diff --git a/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/test/TestHdfsHelper.java b/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/test/TestHdfsHelper.java index 50a1af2deba..85cf48dec7b 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/test/TestHdfsHelper.java +++ b/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/test/TestHdfsHelper.java @@ -39,9 +39,9 @@ public void dummy() { public static final String HADOOP_MINI_HDFS = "test.hadoop.hdfs"; - private static ThreadLocal HDFS_CONF_TL = new InheritableThreadLocal(); + private static final ThreadLocal HDFS_CONF_TL = new InheritableThreadLocal(); - private static ThreadLocal HDFS_TEST_DIR_TL = new InheritableThreadLocal(); + private static final ThreadLocal HDFS_TEST_DIR_TL = new InheritableThreadLocal(); @Override public Statement apply(Statement statement, FrameworkMethod frameworkMethod, Object o) { diff --git a/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/test/TestJettyHelper.java b/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/test/TestJettyHelper.java index 50b4327701f..4c17aa7dc79 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/test/TestJettyHelper.java +++ b/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/test/TestJettyHelper.java @@ -52,7 +52,7 @@ public TestJettyHelper(String keyStoreType, String keyStore, this.keyStorePassword = keyStorePassword; } - private static ThreadLocal TEST_JETTY_TL = + private static final ThreadLocal TEST_JETTY_TL = new InheritableThreadLocal(); @Override diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapred/lib/Chain.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapred/lib/Chain.java index 57841f0d781..c1d3f9f5f1f 100644 --- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapred/lib/Chain.java +++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapred/lib/Chain.java @@ -290,7 +290,7 @@ public void close() throws IOException { // using a ThreadLocal to reuse the ByteArrayOutputStream used for ser/deser // it has to be a thread local because if not it would break if used from a // MultiThreadedMapRunner. - private ThreadLocal threadLocalDataOutputBuffer = + private final ThreadLocal threadLocalDataOutputBuffer = new ThreadLocal() { protected DataOutputBuffer initialValue() { return new DataOutputBuffer(1024); diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapred/pipes/PipesPartitioner.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapred/pipes/PipesPartitioner.java index ef9da0bf01f..3a1042048c7 100644 --- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapred/pipes/PipesPartitioner.java +++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapred/pipes/PipesPartitioner.java @@ -32,7 +32,7 @@ class PipesPartitioner implements Partitioner { - private static ThreadLocal cache = new ThreadLocal(); + private static final ThreadLocal CACHE = new ThreadLocal(); private Partitioner part = null; @SuppressWarnings("unchecked") @@ -46,7 +46,7 @@ public void configure(JobConf conf) { * @param newValue the next partition value */ static void setNextPartition(int newValue) { - cache.set(newValue); + CACHE.set(newValue); } /** @@ -58,7 +58,7 @@ static void setNextPartition(int newValue) { */ public int getPartition(K key, V value, int numPartitions) { - Integer result = cache.get(); + Integer result = CACHE.get(); if (result == null) { return part.getPartition(key, value, numPartitions); } else { diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapreduce/task/reduce/ShuffleSchedulerImpl.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapreduce/task/reduce/ShuffleSchedulerImpl.java index ff0bb4fab24..c0d7e0f0634 100644 --- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapreduce/task/reduce/ShuffleSchedulerImpl.java +++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapreduce/task/reduce/ShuffleSchedulerImpl.java @@ -54,7 +54,8 @@ @InterfaceAudience.Private @InterfaceStability.Unstable public class ShuffleSchedulerImpl implements ShuffleScheduler { - static ThreadLocal shuffleStart = new ThreadLocal() { + private static final ThreadLocal SHUFFLE_START = + new ThreadLocal() { protected Long initialValue() { return 0L; } @@ -423,7 +424,7 @@ public synchronized MapHost getHost() throws InterruptedException { LOG.debug("Assigning " + host + " with " + host.getNumKnownMapOutputs() + " to " + Thread.currentThread().getName()); - shuffleStart.set(Time.monotonicNow()); + SHUFFLE_START.set(Time.monotonicNow()); return host; } @@ -464,7 +465,7 @@ public synchronized void freeHost(MapHost host) { } } LOG.info(host + " freed by " + Thread.currentThread().getName() + " in " + - (Time.monotonicNow()-shuffleStart.get()) + "ms"); + (Time.monotonicNow()-SHUFFLE_START.get()) + "ms"); } public synchronized void resetKnownMaps() { diff --git a/hadoop-tools/hadoop-distcp/src/main/java/org/apache/hadoop/tools/util/DistCpUtils.java b/hadoop-tools/hadoop-distcp/src/main/java/org/apache/hadoop/tools/util/DistCpUtils.java index d34faafba87..5ac5bf11450 100644 --- a/hadoop-tools/hadoop-distcp/src/main/java/org/apache/hadoop/tools/util/DistCpUtils.java +++ b/hadoop-tools/hadoop-distcp/src/main/java/org/apache/hadoop/tools/util/DistCpUtils.java @@ -406,7 +406,7 @@ public static void checkFileSystemXAttrSupport(FileSystem fs) /** * String utility to convert a number-of-bytes to human readable format. */ - private static ThreadLocal FORMATTER + private static final ThreadLocal FORMATTER = new ThreadLocal() { @Override protected DecimalFormat initialValue() { diff --git a/hadoop-tools/hadoop-streaming/src/main/java/org/apache/hadoop/record/BinaryRecordInput.java b/hadoop-tools/hadoop-streaming/src/main/java/org/apache/hadoop/record/BinaryRecordInput.java index 5c302e55e3c..f923a8065fd 100644 --- a/hadoop-tools/hadoop-streaming/src/main/java/org/apache/hadoop/record/BinaryRecordInput.java +++ b/hadoop-tools/hadoop-streaming/src/main/java/org/apache/hadoop/record/BinaryRecordInput.java @@ -57,9 +57,10 @@ private void setDataInput(DataInput inp) { this.in = inp; } - private static ThreadLocal bIn = new ThreadLocal() { + private static final ThreadLocal B_IN = + new ThreadLocal() { @Override - protected synchronized Object initialValue() { + protected BinaryRecordInput initialValue() { return new BinaryRecordInput(); } }; @@ -70,7 +71,7 @@ protected synchronized Object initialValue() { * @return binary record input corresponding to the supplied DataInput. */ public static BinaryRecordInput get(DataInput inp) { - BinaryRecordInput bin = (BinaryRecordInput) bIn.get(); + BinaryRecordInput bin = B_IN.get(); bin.setDataInput(inp); return bin; } diff --git a/hadoop-tools/hadoop-streaming/src/main/java/org/apache/hadoop/record/BinaryRecordOutput.java b/hadoop-tools/hadoop-streaming/src/main/java/org/apache/hadoop/record/BinaryRecordOutput.java index aa6b8e95c53..adc01f311f8 100644 --- a/hadoop-tools/hadoop-streaming/src/main/java/org/apache/hadoop/record/BinaryRecordOutput.java +++ b/hadoop-tools/hadoop-streaming/src/main/java/org/apache/hadoop/record/BinaryRecordOutput.java @@ -44,20 +44,21 @@ private void setDataOutput(DataOutput out) { this.out = out; } - private static ThreadLocal bOut = new ThreadLocal() { - @Override - protected synchronized Object initialValue() { - return new BinaryRecordOutput(); - } - }; - + private static final ThreadLocal B_OUT = + new ThreadLocal() { + @Override + protected BinaryRecordOutput initialValue() { + return new BinaryRecordOutput(); + } + }; + /** * Get a thread-local record output for the supplied DataOutput. * @param out data output stream * @return binary record output corresponding to the supplied DataOutput. */ public static BinaryRecordOutput get(DataOutput out) { - BinaryRecordOutput bout = (BinaryRecordOutput) bOut.get(); + BinaryRecordOutput bout = B_OUT.get(); bout.setDataOutput(out); return bout; } diff --git a/hadoop-tools/hadoop-streaming/src/main/java/org/apache/hadoop/typedbytes/TypedBytesInput.java b/hadoop-tools/hadoop-streaming/src/main/java/org/apache/hadoop/typedbytes/TypedBytesInput.java index b964d73ca95..cff0be24b21 100644 --- a/hadoop-tools/hadoop-streaming/src/main/java/org/apache/hadoop/typedbytes/TypedBytesInput.java +++ b/hadoop-tools/hadoop-streaming/src/main/java/org/apache/hadoop/typedbytes/TypedBytesInput.java @@ -41,8 +41,10 @@ private void setDataInput(DataInput in) { this.in = in; } - private static ThreadLocal tbIn = new ThreadLocal() { - protected synchronized Object initialValue() { + private static final ThreadLocal TB_IN = + new ThreadLocal() { + @Override + protected TypedBytesInput initialValue() { return new TypedBytesInput(); } }; @@ -53,7 +55,7 @@ protected synchronized Object initialValue() { * @return typed bytes input corresponding to the supplied {@link DataInput}. */ public static TypedBytesInput get(DataInput in) { - TypedBytesInput bin = (TypedBytesInput) tbIn.get(); + TypedBytesInput bin = TB_IN.get(); bin.setDataInput(in); return bin; } diff --git a/hadoop-tools/hadoop-streaming/src/main/java/org/apache/hadoop/typedbytes/TypedBytesOutput.java b/hadoop-tools/hadoop-streaming/src/main/java/org/apache/hadoop/typedbytes/TypedBytesOutput.java index 243ad45ec1a..ecb35656c6c 100644 --- a/hadoop-tools/hadoop-streaming/src/main/java/org/apache/hadoop/typedbytes/TypedBytesOutput.java +++ b/hadoop-tools/hadoop-streaming/src/main/java/org/apache/hadoop/typedbytes/TypedBytesOutput.java @@ -42,8 +42,10 @@ private void setDataOutput(DataOutput out) { this.out = out; } - private static ThreadLocal tbOut = new ThreadLocal() { - protected synchronized Object initialValue() { + private static final ThreadLocal TB_OUT = + new ThreadLocal() { + @Override + protected TypedBytesOutput initialValue() { return new TypedBytesOutput(); } }; @@ -56,7 +58,7 @@ protected synchronized Object initialValue() { * {@link DataOutput}. */ public static TypedBytesOutput get(DataOutput out) { - TypedBytesOutput bout = (TypedBytesOutput) tbOut.get(); + TypedBytesOutput bout = TB_OUT.get(); bout.setDataOutput(out); return bout; } diff --git a/hadoop-tools/hadoop-streaming/src/main/java/org/apache/hadoop/typedbytes/TypedBytesRecordInput.java b/hadoop-tools/hadoop-streaming/src/main/java/org/apache/hadoop/typedbytes/TypedBytesRecordInput.java index 999017f7911..e5e918c7d7c 100644 --- a/hadoop-tools/hadoop-streaming/src/main/java/org/apache/hadoop/typedbytes/TypedBytesRecordInput.java +++ b/hadoop-tools/hadoop-streaming/src/main/java/org/apache/hadoop/typedbytes/TypedBytesRecordInput.java @@ -38,8 +38,10 @@ private void setTypedBytesInput(TypedBytesInput in) { this.in = in; } - private static ThreadLocal tbIn = new ThreadLocal() { - protected synchronized Object initialValue() { + private static final ThreadLocal TB_IN = + new ThreadLocal() { + @Override + protected TypedBytesRecordInput initialValue() { return new TypedBytesRecordInput(); } }; @@ -53,7 +55,7 @@ protected synchronized Object initialValue() { * {@link TypedBytesInput}. */ public static TypedBytesRecordInput get(TypedBytesInput in) { - TypedBytesRecordInput bin = (TypedBytesRecordInput) tbIn.get(); + TypedBytesRecordInput bin = TB_IN.get(); bin.setTypedBytesInput(in); return bin; } diff --git a/hadoop-tools/hadoop-streaming/src/main/java/org/apache/hadoop/typedbytes/TypedBytesRecordOutput.java b/hadoop-tools/hadoop-streaming/src/main/java/org/apache/hadoop/typedbytes/TypedBytesRecordOutput.java index 59012bcee87..8f55206f7d3 100644 --- a/hadoop-tools/hadoop-streaming/src/main/java/org/apache/hadoop/typedbytes/TypedBytesRecordOutput.java +++ b/hadoop-tools/hadoop-streaming/src/main/java/org/apache/hadoop/typedbytes/TypedBytesRecordOutput.java @@ -40,8 +40,10 @@ private void setTypedBytesOutput(TypedBytesOutput out) { this.out = out; } - private static ThreadLocal tbOut = new ThreadLocal() { - protected synchronized Object initialValue() { + private static final ThreadLocal TB_OUT = + new ThreadLocal() { + @Override + protected TypedBytesRecordOutput initialValue() { return new TypedBytesRecordOutput(); } }; @@ -55,7 +57,7 @@ protected synchronized Object initialValue() { * {@link TypedBytesOutput}. */ public static TypedBytesRecordOutput get(TypedBytesOutput out) { - TypedBytesRecordOutput bout = (TypedBytesRecordOutput) tbOut.get(); + TypedBytesRecordOutput bout = TB_OUT.get(); bout.setTypedBytesOutput(out); return bout; } diff --git a/hadoop-tools/hadoop-streaming/src/main/java/org/apache/hadoop/typedbytes/TypedBytesWritableInput.java b/hadoop-tools/hadoop-streaming/src/main/java/org/apache/hadoop/typedbytes/TypedBytesWritableInput.java index f15ae268375..a7ca12cf93c 100644 --- a/hadoop-tools/hadoop-streaming/src/main/java/org/apache/hadoop/typedbytes/TypedBytesWritableInput.java +++ b/hadoop-tools/hadoop-streaming/src/main/java/org/apache/hadoop/typedbytes/TypedBytesWritableInput.java @@ -61,8 +61,10 @@ private void setTypedBytesInput(TypedBytesInput in) { this.in = in; } - private static ThreadLocal tbIn = new ThreadLocal() { - protected synchronized Object initialValue() { + private static final ThreadLocal TB_IN = + new ThreadLocal() { + @Override + protected TypedBytesWritableInput initialValue() { return new TypedBytesWritableInput(); } }; @@ -76,7 +78,7 @@ protected synchronized Object initialValue() { * {@link TypedBytesInput}. */ public static TypedBytesWritableInput get(TypedBytesInput in) { - TypedBytesWritableInput bin = (TypedBytesWritableInput) tbIn.get(); + TypedBytesWritableInput bin = TB_IN.get(); bin.setTypedBytesInput(in); return bin; } diff --git a/hadoop-tools/hadoop-streaming/src/main/java/org/apache/hadoop/typedbytes/TypedBytesWritableOutput.java b/hadoop-tools/hadoop-streaming/src/main/java/org/apache/hadoop/typedbytes/TypedBytesWritableOutput.java index 3fb11cc2630..8dd047271ab 100644 --- a/hadoop-tools/hadoop-streaming/src/main/java/org/apache/hadoop/typedbytes/TypedBytesWritableOutput.java +++ b/hadoop-tools/hadoop-streaming/src/main/java/org/apache/hadoop/typedbytes/TypedBytesWritableOutput.java @@ -58,8 +58,10 @@ private void setTypedBytesOutput(TypedBytesOutput out) { this.out = out; } - private static ThreadLocal tbOut = new ThreadLocal() { - protected synchronized Object initialValue() { + private static final ThreadLocal TB_OUT = + new ThreadLocal() { + @Override + protected TypedBytesWritableOutput initialValue() { return new TypedBytesWritableOutput(); } }; @@ -73,7 +75,7 @@ protected synchronized Object initialValue() { * {@link TypedBytesOutput}. */ public static TypedBytesWritableOutput get(TypedBytesOutput out) { - TypedBytesWritableOutput bout = (TypedBytesWritableOutput) tbOut.get(); + TypedBytesWritableOutput bout = TB_OUT.get(); bout.setTypedBytesOutput(out); return bout; }