我在看多线程,看了好几本书关于多线程的章节之后,对于用synchronized 加锁有个疑问:如下代码:
class A
{
Integer i; public int getI()
{
return ++i;
}}假如i是临界资源,我们在多线程访问的时候,都知道要同步,那到底该怎么用synchronized 呢
一个说法是直接
public synchronized int getI()
{
return ++i;
}第二种是说把synchronized 加到方法内部,这样:
public int getI()
{
synchronized (i) {
return ++i;
}

}
还有一种是直接把i换成this,如
public int getI()
{
synchronized (this) {
return ++i;
}

}
我知道其实这3种都对吧,但是我不知道什么情况下用第一种好,什么情况下第二种好,什么情况下第三种好,请赐教

解决方案 »

  1.   

    synchronized 方法和你进方法后立刻synchronized  this 含义一样,
    并且A只有一个实例的话,上面3个都对的。
    如果你明确是要在i上做操作的话当然synchronized  i 好
      

  2.   

    public synchronized int getI() { return ++i; }
    这个就是锁住this对象。
    锁住整个函数体,用在里面锁住相应的函数体。
      

  3.   

    具体情况,就你的这个例子而言,都可以,而且第一第三个的持有锁对象都是this,第二个是i