问题概述:
为了测试多线程对SystemConfig类中params的影响,延时以查看效果。使用了wait进行测试,也可以使用Thread.sleep。在使用wait时,报java.lang.IllegalMonitorStateException错误。
代码:
private static Map<String, String> params = new ConcurrentHashMap<>();//存储全局变量
/**
* 刷新所有的参数
*/
public void refreshAllParams() throws InterruptedException {
synchronized (SystemConfig.class) {
params.clear();
wait(10000);
loadAllParams();
}
}
解决:
synchronized同步的对象是SystemConfig类,正确方式:
public void refreshAllParams() throws InterruptedException {
synchronized (this) {//应该同步调用当前方法的对象
params.clear();
wait(10000);
loadAllParams();
}
}
原因:
synchronized应该同步调用当前方法的对象,而不是同步SystemConfig.class。
注意:
本文是为了同步static类型的params变量,即:
private static Map<String, String> params = new ConcurrentHashMap<>();//存储全局变量
而使用synchronized (this)是无法同步static变量的,
synchronized (this) //无法同步static变量
因此,最终方式:
private static Map<String, String> params = new ConcurrentHashMap<>();//存储全局变量
/**
* 刷新所有的参数
*/
public void refreshAllParams() throws InterruptedException {
synchronized (SystemConfig.class) {//同步static变量params
params.clear();
Thread.sleep(10000); //睡眠10秒钟
loadAllParams();
}
}