多线程中同步的问题
class MBank {
public void take(){
String s = new String( "ss ");//1
String s = "ss "; //2
synchronized(s){ //同步块 }
}
}
请问使用语句1和语句2有什么区别呢?
------解决方案--------------------第一个是初始化一个新创建的 String 对象,也就是 "ss ",表示一个与该参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的一个副本。这里是创建了2个对象.
第二个是 "ss "对象的引用指向s,也就是说s存的是对象 "ss "的内存地址而不是对象本身,就像户籍本一样.
------解决方案--------------------语句1语句2对同步没有影响的啊.
实际的内容是一样的....
相对而言2的效率高于1而已
------解决方案--------------------通常写同步代码的lock写法如下:
Object lock = new Object();//该对象往往是静态变量,由ClassLoader加载机制保证其唯一。
...
synchronized(lock){ //同步块 }
所以你那两种写法完全没有区别。当然也没什么必要写那么麻烦。另外有个缺点,产生多个该对象的时候,无法同步,因为s可能在不同的对象中是不同的值。