public class Test { public static void main(String[] args) {
new Thread(){
public void run(){
send("zhangsan");
}
}.start();
new Thread(){
public void run(){
send("zhangsan");
}
}.start();
new Thread(){
public void run(){
send("lisi");
}
}.start();
}
public static void send(String name){
synchronized (name) {
System.out.println(Thread.currentThread().getName() + "," + name);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
目前自己测试了一把,可以测出“zhangsan”因为被加锁所以第二个线程只能5秒后才处理。
没有发现什么问题,可以满足我的需求。
但听一朋友说java对String加锁有什么潜在的bug,还被sun列在bug list上,具体又说上不来,搞得我有点不淡定了。
所以来这里请教一下知道的人。
jetty-352
其他我就不知道了
所以我标题说了,是对非new出来的String加锁。
这样用,会起到同步作用,是因为zhangsan是个字符常量,分布在数据区
如果你这样用send(new String("zhangsan"));就不会同步,因为是在堆上分配的2个不同对象
虽然值一样,所以进一步说明,锁定的是对象引用,而不是值