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) {
            ...
        }
    }
}