From e9856c47e5217ea8a41b0f08b1397dee3c7e041d Mon Sep 17 00:00:00 2001 From: Zongheng Yang Date: Thu, 5 Jun 2014 23:33:33 -0700 Subject: [PATCH] Use java.util.Collections.synchronizedMap on a Java HashMap. --- .../scala/org/apache/spark/sql/SQLConf.scala | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/sql/core/src/main/scala/org/apache/spark/sql/SQLConf.scala b/sql/core/src/main/scala/org/apache/spark/sql/SQLConf.scala index 4411a086e7d72..cf1df05ef4c79 100644 --- a/sql/core/src/main/scala/org/apache/spark/sql/SQLConf.scala +++ b/sql/core/src/main/scala/org/apache/spark/sql/SQLConf.scala @@ -19,7 +19,7 @@ package org.apache.spark.sql import java.util.Properties -import scala.collection.mutable +import scala.collection.JavaConverters._ /** * SQLConf holds mutable config parameters and hints. These can be set and @@ -29,7 +29,8 @@ import scala.collection.mutable */ class SQLConf { - protected val settings = new mutable.HashMap[String, String]() + private val settings = java.util.Collections.synchronizedMap( + new java.util.HashMap[String, String]()) private[spark] def clear() { settings.clear() @@ -37,35 +38,39 @@ class SQLConf { def this(props: Properties) = { this() - import scala.collection.JavaConversions._ // implicits for java.util.Properties - props.foreach { case (k, v) => this.settings(k) = v } + props.asScala.foreach { case (k, v) => this.settings.put(k, v) } } def set(key: String, value: String): SQLConf = { require(key != null, "key cannot be null") require(value != null, s"value cannot be null for ${key}") - settings(key) = value + settings.put(key, value) this } def get(key: String): String = { - settings.getOrElse(key, throw new NoSuchElementException(key)) + if (!settings.containsKey(key)) { + throw new NoSuchElementException(key) + } + settings.get(key) } def get(key: String, defaultValue: String): String = { - settings.getOrElse(key, defaultValue) + if (!settings.containsKey(key)) defaultValue else settings.get(key) } - def getAll: Array[(String, String)] = settings.clone().toArray + def getAll: Array[(String, String)] = settings.asScala.toArray def getOption(key: String): Option[String] = { - settings.get(key) + if (!settings.containsKey(key)) None else Some(settings.get(key)) } - def contains(key: String): Boolean = settings.contains(key) + def contains(key: String): Boolean = settings.containsKey(key) def toDebugString: String = { - settings.toArray.sorted.map{ case (k, v) => s"$k=$v" }.mkString("\n") + settings.synchronized { + settings.asScala.toArray.sorted.map{ case (k, v) => s"$k=$v" }.mkString("\n") + } } }