* 不要以字符串常量作为锁定对象
* 在下面的例子中,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){}
}
}