在方法级别同步可以被Lock取代吗?

时间:2016-10-11 17:23:50

标签: java concurrency

在编写线程安全类时,我们在代码中的两个位置使用synchronized关键字,

1.Modod level synchronization

2.Synchronized blocks

据我所知,Lockjava.util.concurrent.locks.Lock)等接口只能在块级别使用synchronized而不能用于方法级别。或者有办法吗?

我没有真正需要它,但只是好奇,因为听过Lock可以替代synchronized的讨论。

public class SampleClass {
    public synchronized void method(){
      .....
    }
}

3 个答案:

答案 0 :(得分:3)

“在方法开头获取Lock,并在最后释放它”没有特殊的语法,就像synchronized一样。

当然,你可以自己这样做:

public void method() {
    lock.lock();
    try {
        // rest of the method
    } finally {
        lock.unlock();
    }
}

答案 1 :(得分:1)

众所周知

public class SampleClass {
    public synchronized void method(){
      .....
    }
}

public class SampleClass {
    public void method(){
        synchronized(this) {
           .....
        }
    }
}

等同于所有实际目的。

因此,您需要将方法同步更改为等效的块同步,后者可以替换为Lock

答案 2 :(得分:1)

不,自$doc = new DOMDocument(); $doc->loadHTML($html); // find 3th p tag $p = $doc->getElementsByTagName("p")->item(2); // create new div tag $div = $doc->createElement("div", "Something different"); // insert created element after 3th p $p->parentNode->insertBefore($div, $p); $html = $doc->saveHTML(); 以来没有办法执行此操作 - 因此java.util.concurrent或任何其他实现 - 只是一个库,而Lock是其中的一部分Java Language Specification

关于" synchronized可以替代同步",Brian Goetz在第13.4章的"Java Concurrency in Practice"中对此进行了讨论:

  对于内部锁定不实用的情况,

Lock是一种高级工具。如果您需要其高级功能,请使用它:定时,轮询或可中断锁定获取,公平排队或非块结构锁定。否则,更喜欢同步。