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();
    }
}

 

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