Properties 类使用需要注意的坑
Properties 类位于 java.util 包下 ,是 Java 语言的配置文件所使用的类。
xxx.properties 为 Java 语言常见的配置文件,如数据库的配置 jdbc.properties, 系统参数配 system.properties,每行以键值对的形式存在即:key1=value。如果 key 相同,后面的覆盖前面的。以#
开头的是注释。Properties 类继承 Hashtable,以 Map 的形式进行存储。
用Properties
读取配置文件,一共有三步:
创建
Properties
实例;调用
load()
读取文件;调用
getProperty()
获取配置。
调用getProperty()
获取配置时,如果 key 不存在,将返回null
。我们还可以提供一个默认值,这样,当 key 不存在的时候,就返回默认值。
Properties 能方便的读取 properties 文件内容。但是 getProperty(key)方法会有点问题,在使用中要注意避免在其他地方直接使用,为什么这么说呢?我们来看看它的源码就清楚了。
以下是关键代码:
public String getProperty(String key){
Object oval = super.get(key);
String sval = (oval instanceof String) ? (String)oval : null;
return ((sval == null) && (defaults != null)) ? defaults.getProperty(key) : sval;
}
public synchronized V get(Object key) {
Entry tab[] = table;
int hash = hash(key);
int index = (hash & 0x7FFFFFFF) % tab.length;
for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) {
if ((e.hash == hash) && e.key.equals(key))
{
return e.value;
}
}
return null;
}
从源码中可以看出获取的时候,加了 synchronized 关键字,也即是加了锁,虽然是线程安全的,在并发条件下,会有性能问题。
解决方法:
可以采用使用前先进行预加载读取,存入 ConcurrentHashMap 中,然后再提供统一获取方法,这样即保证了线程安全又保证了性能。
版权声明: 本文为 InfoQ 作者【风翱】的原创文章。
原文链接:【http://xie.infoq.cn/article/f6ca084158ca0e356007eb8ca】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论