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

java 下列代码中对象锁的使用效率最高的是,在线等
A.public class Foo{
  private Object o1,o2;
  public synchronized void methodA(){对o1进行操作}
  public synchronized void methodB(){对o1进行操作}  
  public synchronized void methodC(){对o2进行操作}
  public synchronized void methodD(){对o2进行操作}  
  }

B.public class Foo{  
  private Object lock = new Object();
  private Object o1,o2;
  public void methodA(){synchronized(lock){对o1进行操作}}
  public void methodB(){synchronized(lock){对o1进行操作}}  
  public void methodC(){synchronized(lock){对o2进行操作}}
  public void methodD(){synchronized(lock){对o2进行操作}}
  }

C.public class Foo{  
  private Object lock = new Object(),lock2 = new Object();
  private Object o1,o2;
  public void methodA(){synchronized(lock){对o1进行操作}}
  public void methodB(){synchronized(lock){对o1进行操作}}  
  public void methodC(){synchronized(lock2){对o2进行操作}}
  public void methodD(){synchronized(lock2){对o2进行操作}}
  }

D.public class Foo{  
  private Object lock = new Object(),lock2 = new Object();
  private Object o1,o2;
  public void methodA(){synchronized(lock){对o1进行操作}}
  public void methodB(){synchronized(lock2){对o1进行操作}}  
  public void methodC(){synchronized(lock){对o2进行操作}}
  public void methodD(){synchronized(lock2){对o2进行操作}}
  }

正确答案:C

为什么选c呢,thanks

------解决方案--------------------
o1和o2是两个不同在资源,对o1进行操做的方法归为一类,对o2进行操作在方法归为另外一类。也就是说对o1进行操作在这类方法之间要进行同步,对o2进行操作在这类方法也要进行同步,但是o1和o2是两个不同在资源,所以他们之间在同步是是没有任何关联的。首先看答案1中,synchronized放在普通方法的声明中,那么此时的多线程监视器,也就是那个锁,为this.也就是Foo对象,此时两个资源在同步用到了同一个锁,明显效率不是很高,记住,两个资源的同步应该是没有任何关联的,而用同一把锁,就等于是把他们关联到一起了,效率自然低了。答案二中同步锁为lock对象,lock对象只有一个,和答案2中效率差不多。
答案三中,两个资源的同步用到了不同的锁,互相之间没有影响。答案四中,两个资源的同步方法互相用了两个锁,造成两个资源的同步有了关联,但是两个资源的同步本应该是没有关联胡,所以效率当然就降低了。
综上,所以选C。

靠,刚喝过酒,晕晕忽忽的,语言逻辑有点问题,LZ凑合着看吧。
------解决方案--------------------
对象锁的使用效率这个含义不是很清楚,所以随便说说了12相同,都是使用一个对象作为锁,34的都是采用两个对象作为锁,不同的是3里面每个锁只对相同资源o1(o2)进行锁定,而4则相反。果然你想对两个资源同时操作,那么3是互不影响的,而4有可能你操作了o1,o2也被锁定了,所以“效率”低。