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

mac2025-01-20  60

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

 

最新回复(0)