在编写线程安全类时,我们在代码中的两个位置使用synchronized关键字,
1.方法级同步
2.同步块
据我所知,像Lock (java.util.concurrent.locks.Lock)这样的接口只能在块级代替synchronized,而不能在方法级别使用。还是有办法?
我没有任何真正的需要,但只是好奇,因为听说Lock可以取代synchronized。
public class SampleClass {
public synchronized void method(){
.....
}
}发布于 2016-10-11 17:30:12
没有特殊的语法用于“在方法开始时获取锁,并在结束时释放它”,就像对于synchronized一样。
当然,你可以自己做:
public void method() {
lock.lock();
try {
// rest of the method
} finally {
lock.unlock();
}
}发布于 2016-10-11 17:31:20
我们都知道
public class SampleClass {
public synchronized void method(){
.....
}
}和
public class SampleClass {
public void method(){
synchronized(this) {
.....
}
}
}在所有实际用途上都是同等的。
因此,您需要将方法同步更改为等效的块同步,而后者可以由Lock替换。
发布于 2016-10-11 19:02:06
不,没有办法做到这一点,因为java.util.concurrent-and因此Lock或任何其他实现也只是一个库,而synchronized是Java语言规范的一部分。
关于"Lock可以替代同步“,Brian在"Java并发在实践中“第13.4章中讨论了这一点:
ReentrantLock是一种高级工具,用于处理内部锁定不实用的情况。如果您需要它的高级功能,可以使用它:定时、轮询或可中断锁获取、公平排队或非块结构锁定。否则,更喜欢同步。
https://stackoverflow.com/questions/39983070
复制相似问题