在编写线程安全类时,我们在代码中的两个位置使用synchronized
关键字,
1.Modod level synchronization
2.Synchronized blocks
据我所知,Lock
(java.util.concurrent.locks.Lock
)等接口只能在块级别使用synchronized
而不能用于方法级别。或者有办法吗?
我没有真正需要它,但只是好奇,因为听过Lock
可以替代synchronized
的讨论。
public class SampleClass {
public synchronized void method(){
.....
}
}
答案 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
是一种高级工具。如果您需要其高级功能,请使用它:定时,轮询或可中断锁定获取,公平排队或非块结构锁定。否则,更喜欢同步。