写点什么

Properties 类使用需要注意的坑

用户头像
风翱
关注
发布于: 2021 年 04 月 20 日

Properties 类位于 java.util 包下 ,是 Java 语言的配置文件所使用的类。

xxx.properties 为 Java 语言常见的配置文件,如数据库的配置 jdbc.properties, 系统参数配 system.properties,每行以键值对的形式存在即:key1=value。如果 key 相同,后面的覆盖前面的。以#开头的是注释。Properties 类继承 Hashtable,以 Map 的形式进行存储。


Properties读取配置文件,一共有三步:

  1. 创建Properties实例;

  2. 调用load()读取文件;

  3. 调用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 中,然后再提供统一获取方法,这样即保证了线程安全又保证了性能。

发布于: 2021 年 04 月 20 日阅读数: 7
用户头像

风翱

关注

还未添加个人签名 2017.11.24 加入

勇于尝试,持续成长

评论

发布
暂无评论
Properties类使用需要注意的坑