Java 具有私有不可变对象的同步块和同步方法差异
为什么上面的代码比下面的代码好:Java 具有私有不可变对象的同步块和同步方法差异,java,multithreading,synchronization,Java,Multithreading,Synchronization,为什么上面的代码比下面的代码好: private final Object lockObject = new Object(); public void getCount() { synchronized( lockObject ) { ... } } 我搜索并找到了下面提到的解释 将它放在方法上意味着您正在使用对象的锁 它本身提供线程安全性。有了这种机制,它是 您代码的恶意用户也可能获得上的锁 你的对象,并永远保持它,有效地阻止其他线程。 非恶意用户可以在无意
private final Object lockObject = new Object();
public void getCount() {
synchronized( lockObject ) {
...
}
}
我搜索并找到了下面提到的解释
将它放在方法上意味着您正在使用对象的锁
它本身提供线程安全性。有了这种机制,它是
您代码的恶意用户也可能获得上的锁
你的对象,并永远保持它,有效地阻止其他线程。
非恶意用户可以在无意中有效地做同样的事情
但我不能完全理解这一点。一个恶意用户怎么能永远持有一把锁?任何人都可以用一个示例代码来解释上述情况吗?
public void synchronized getCount() {
...
}
它正在当前对象上同步此
。其他类可以获取当前对象的引用并将其用作监视器锁:
public class Example {
public void synchronized getCount() {
...
}
}
这可能会得到意外的结果,例如,在执行otherMethod
时导致getCount
被阻塞
对于第一种方法,由于监视器锁是私有的,其他类无法直接访问它,因此它比第二种方法更可取。简单地说- 当您在方法级别使用锁定时,您将获得具有同步方法的完整类的对象的锁定 假设有任何用户提供了一些闪亮的代码来执行方法,直到宇宙结束。。这将导致其他线程因使用类中的其他方法而被阻止
这是监视器对象和同步块是首选方式的原因 请参阅此答案@user7 Iam不查找同步块和同步方法之间的差异。我想答案中已经提到了,只是好奇:你为什么想知道这里的区别?你有什么问题吗?关于最佳做法的一般性问题?还有什么?恶意用户可以像这样永远持有锁:
synchronized(yourObject){while(true);}
。
public class OtherClass {
public void otherMethod() {
Example example = new Example();
synchronized (example) {
...
}
}
}