Java 使可重入锁定为静态并使其成为互斥锁吗?

Java 使可重入锁定为静态并使其成为互斥锁吗?,java,locking,mutex,reentrantlock,Java,Locking,Mutex,Reentrantlock,在Brian Goetz的书《Java并发在实践中》中,他的可重入锁示例编程如下: Lock lock = new ReentrantLock(); 但是,我很想知道是否将上述代码更改为: private static final Lock lock = new ReentrantLock(); 使锁现在充当互斥锁,或者如果它是不必要的和冗余的 因此,如果锁是私有的、静态的和最终的,那么该代码的功能会改变吗 lock.lock(); try { //method stuff } fi

在Brian Goetz的书《Java并发在实践中》中,他的可重入锁示例编程如下:

Lock lock = new ReentrantLock();
但是,我很想知道是否将上述代码更改为:

private static final Lock lock = new ReentrantLock();
使锁现在充当互斥锁,或者如果它是不必要的和冗余的

因此,如果锁是私有的、静态的和最终的,那么该代码的功能会改变吗

lock.lock();
try {
    //method stuff
} finally {
    lock.unlock();
}
提前谢谢大家。 马特是的

final
private
当然没有影响,但是
static
意味着所有实例共享相同的锁

因此,如果有两个实例,那么代码块不能由两个线程同时执行


如果锁不是静态的,则每个实例都有自己的锁。这意味着更多的线程可以同时运行代码(当然,这取决于它们工作的实例)。

创建静态锁等同于

synchronized(MyClass.class){

}

它本质上是一个类级锁

另请参阅,以获取有关锁与同步关键字的更多信息。很抱歉将此帖子挖出来,但我现在正在查看此主题。如果创建一个
私有静态最终可重入锁
不被认为是代码气味,我很感兴趣?我已经读到静态变量是邪恶的,但我目前正在处理的用例看起来是使用静态变量的理想场所。想帮忙吗?@Bobzone我建议问一个新问题。如果我在这里回答这个问题,只有很少的人能找到它。@Aarondigula按照建议创建了这个线程:不完全是。该类是公共的,任何调用方都可以执行锁定。指定的可重入锁是私有的,因此只有类可以访问该锁。您假设该类是公共的,而不是子类、私有类、受保护类或受包保护的类。然而,我的回答更多的是为了说明锁和类之间的关系。