問題概述:
爲了測試多線程對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();
}
}