Java并发编程--不要使用字符串常量作为synchronized锁对象

* 不要以字符串常量作为锁定对象
* 在下面的例子中,m1和m2其实锁定的是同一个对象
* 这种情况下会发生比较诡异的现象,比如你用到了一个类库,在该类库中代码锁定了字符串“hello”
* 但是你读不到源码,所以你也在代码中锁定了“hello”,这时候就有可能发生特别诡异的死锁阻塞
* 因为你的程序和类库不经意间使用到了同一把锁

jetty曾遇到过类似的锁问题。

public class StringNotUse {
    /**
     * 不要以字符串常量作为锁定对象
     * 在下面的例子中,m1和m2其实锁定的是同一个对象
     * 这种情况下会发生比较诡异的现象,比如你用到了一个类库,在该类库中代码锁定了字符串“hello”
     * 但是你读不到源码,所以你也在代码中锁定了“hello”,这时候就有可能发生特别诡异的死锁阻塞
     * 因为你的程序和类库不经意间使用到了同一把锁
     */

    String s1 = "hello";
    String s2 = "hello";

    void m1(){
        synchronized (s1){}
    }

    void m2(){
        synchronized (s2){}
    }

}

 

你可能感兴趣的:(Java基础)