private final Object lockObject = new Object();
public void getCount() {
synchronized( lockObject ) {
...
}
}
为什么上面的代码比下面的代码更好:
public void synchronized getCount() {
...
}
我进行了搜索,找到了如下所述的解释。
将其放在方法上意味着您正在使用对象的锁定 本身提供线程安全。通过这种机制, 您的代码的恶意用户也有可能获得锁定 您的对象,并将其永久保存,有效地阻塞了其他线程。 非恶意用户可以无意中有效地执行相同的操作。
但是我无法完全理解这一点。恶意用户如何永久持有锁?任何人都可以给出示例代码来说明上述情况吗?
答案 0 :(得分:1)
使用
public class Example {
public void synchronized getCount() {
...
}
}
它正在当前对象this
上同步。其他类能够获取当前对象的引用并将其用作监视器锁定:
public class OtherClass {
public void otherMethod() {
Example example = new Example();
synchronized (example) {
...
}
}
}
这可能会得到意外的结果,例如,导致getCount
被执行时被阻塞。
采用第一种方法时,由于监视器锁otherMethod
是私有的,因此其他类无法直接访问它,因此它比第二种方法更可取。
答案 1 :(得分:0)
简单地说-
在方法级别使用锁定时,您将获得已同步方法的完整类对象的锁定。
假设是否有任何用户带有一些闪亮的代码来执行方法,直到Universe结束..这将导致其他线程因使用类中的其他方法而被阻塞。
这是首选监视对象和同步块的原因。