对于字符串,当且仅当s.equals(t)为真,但s==t未必真,
当我们定义一个函数,希望equals相等的用户名不能同时执行,
public static void test(String a,String lock){
/**
* 当且仅当s.equals(t)为真,但s==t未必真
*/
synchronized(lock){
while (true){
System.out.println(a);
}
}
}
上面方面假如同时调用
test("qqqqqqqq",new String("111")) ;
test("kkkkkkkkk",new String("111")) ;
由于new String("111")==new String("111") ;为false ,并不能达到互锁,因为里面的lock对象不相等,不是同一把锁
如何实现互锁呢?使用intern方法,可以实现
public static void test(String a,String lock){
/**
* lock.intern() : 当且仅当s.equals(t)为真,则s.intern()==t.intern()为真
* 当且仅当s.equals(t)为真,但s==t未必真
*/
synchronized(lock.intern()){
while (true){
System.out.println(a);
}
}
}
String对象的intern方法的官方解释:
It follows that for any two strings s and t, s.intern() == t.intern() is true if and only if s.equals(t) is true.
翻译为:当且仅当s.equals(t)为真,则s.intern()==t.intern()为真