java.lang.IllegalMonitorStateExceptionwen

問題概述:

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章