2014-03-06 34 views
3

我有一个关于这行代码的问题:多线程:显式锁

class S1Es3SharedState { 
    //lock 
    private final Lock lock = new ReentrantLock(); 
    private int x = 0; 

    public int getX() { 
     lock.lock(); 
     try { 
      return x; 
     } finally { 
      lock.unlock(); 
     } 
    } 

    public void incrementX() { 
     lock.lock(); 
     try { 
      this.x = x++; 
     } finally { 
      lock.unlock(); 
     } 
    } 
} 

相同的对象锁定在statments方法的getX和方法incrementX
是什么意思?
如果我明白这意味着同一个对象用于锁定两个方法的陈述,那么如果两个方法都是免费的,则线程可以输入这些方法之一,对吗?

例如:
ThreadA中处于的getX方法内,现在有一个上下文切换所以ThreadA中正在等待(在方法内)和ThreadB正在运行,并且想要在的getX(进入)方法,但它不能因为已经有了ThreadA。另外如果ThreadB需要输入增量X方法仍然不能,因为ThreadA在getX方法中。所以我使用的锁对象允许在两个方法都是空闲的情况下(没有正在运行的线程)输入一个线程。有可能的?发生这种情况是因为我使用相同的对象来锁定getX和incrementX方法。

+0

只是一个方面的评论,没有什么与你的问题有关......你知道'this.x = x ++'比'x ++'更加冗长和奇怪吗? – morgano

+0

是的,但我做了与日食(以自动方式)非常快只是为了举一个例子,在每一种情况下,我知道:) –

回答

2

这意味着两个不同的线程T1和T2不能得到
并且在同一时刻递增该变量。

简而言之return x;this.x = x++;不能由两个不同的线程T1和T2同时执行
。线程
哪些进入第一个胜,只有当它完成并打电话解锁,
第二个将有机会自己获得锁自己
并完成他的工作。

+0

谢谢,在一种方式像红绿灯时,当输入T1或T2在这2方法......这种交通灯是红色的,当两种方法都是免费的时候它们都是绿色的,这是正确的?这个红绿灯控制2条街道(方法),并且当两条街道都空闲时灯光是绿色的。我能以这种方式想象吗? –

+0

是的,我觉得这是一个很好的比喻。锁对象只是一个,锁对象是交通灯。方法是两条街道。 –

+0

非常感谢你 –