为什么使用ReentrantLock可以使用synchronized(this)?

问题:

我试图理解如果可以使用synchronized (this),使并行锁更重要。在下面的虚拟代码中,我可以做:

  1. 同步整个方法或同步易受攻击的区域(synchronized(this){…})
  2. 或者使用ReentrantLock锁定易受攻击的代码区域。

码:

    private final ReentrantLock lock = new ReentrantLock(); 
    private static List<Integer> ints;

    public Integer getResult(String name) { 
        .
        .
        .
        lock.lock();
        try {
            if (ints.size()==3) {
                ints=null;
                return -9;
            }   

            for (int x=0; x<ints.size(); x++) {
                System.out.println("&#91;"+name+"&#93; "+x+"/"+ints.size()+". values >>>>"+ints.get(x));
            }

        } finally {
            lock.unlock();
        } 
        return random;
}

回答:

synchronized构造不同,ReentrantLockunstructured,即不需要使用块结构进行锁定,甚至可以跨越方法保持锁定。一个例子:

private ReentrantLock lock;

public void foo() {
  ...
  lock.lock();
  ...
}

public void bar() {
  ...
  lock.unlock();
  ...
}

这样的流程不可能通过synchronized结构中的单个监视器来表示。
除此之外,ReentrantLock支持lock pollinginterruptible lock waits that support time-outReentrantLock也支持configurable fairness policy,允许更灵活的线程调度。

此类的构造函数接受可选的fairness参数。当设置true时,在争用下,锁有利于授予对最长等待线程的访问权限。否则,该锁不保证任何特定的访问顺序。使用许多线程访问的公平锁的程序可能会比使用默认设置的整体吞吐量(即,更慢;往往慢得多),但是具有较小的时间差异来获得锁定并保证缺乏饥饿。但是请注意,锁的公平性不能保证线程调度的公平性。因此,使用公平锁的许多线程之一可以连续获得多次,而其他活动线程不进行,而不是当前持有锁。还要注意,未定义的tryLock方法不符合公平性设置。如果锁可用,即使其他线程正在等待,它将成功。

 ReentrantLock 可能也是more scalable,在更高的争用下表现更好。你可以阅读更多关于这个here
但是,这个说法是有争议的看到以下评论:

在可重入锁测试中,每次都会创建一个新的锁,因此没有排除锁定,结果数据无效。此外,IBM链接不提供基础测试的源代码,因此无法表征测试是否正确进行。

您应该何时使用ReentrantLock?根据developerWorks文章…

答案很简单 – 当你真的需要一些它提供synchronized不需要的东西,如定时锁定等待,可中断的锁定等待,非块结构化锁,多个条件变量或锁定轮询时使用它。 ReentrantLock也具有可扩展性的好处,如果你实际上有一个表现出高争议的情况,你应该使用它,但请记住绝大多数synchronized块几乎没有展现任何争用,更不用说高争议了。我建议同步开发,直到同步被证明是不足够的,而不是简单地假设“性能会更好”,如果你使用ReentrantLock。请记住,这些是高级用户的高级工具。 (真正的高级用户倾向于选择最简单的工具,直到他们相信简单的工具是不够的。)和往常一样,先把它做好,然后担心你是否必须更快。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Why use a ReentrantLock if one can use synchronized(this)?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

71 − = 70