日期:2014-05-20  浏览次数:20582 次

多线程中同步的问题
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可能在不同的对象中是不同的值。