我正在阅读Cay S. Horstmann写的“核心Java I”一书,他在第577页中提到了这些特殊锁:
有时会发现“临时”锁,例如
public class Bank
{
private double[] accounts;
private var lock = new Object();
// . . .
public void transfer(int from, int to, int amount)
{
synchronized (lock) // an ad-hoc lock
{
accounts[from] -= amount;
accounts[to] += amount;
}
System.out.println(. . .);
}
}在这里,创建
对象只是为了使用每个Java所拥有的锁。
如您所知,锁定是一种阻止其他线程执行特定代码块的机制。如果锁不是静态的(如上面的代码部分所提到的),那么拥有它的锁的任何线程都不知道其他线程的锁。换句话说,为了执行锁,锁在所有其他线程中都是唯一的。根据这个定义,锁应该是静态的吗?
提前谢谢。
发布于 2020-10-01 12:16:46
在您的示例中,锁不是静态的。原因是它不是类的静态值,而是带有static修饰符的。
如果线程“遇到”synchronized块,该线程将尝试获取引用对象。如果没有提供,那么包含该方法的对象将被锁定。这样的锁是特定于对象的,并在线程离开该代码块时返回。
当调用的方法本身是静态的时,静态锁也可能发生:
public static synchronized void soSomething() {
...
}在这些情况下,周围类的Class对象被锁定,这意味着只有一个线程可以访问类中的任何方法,即static synchronized,即使可以在逻辑上同时访问这些方法。
如果一个特定的子集ob功能应该同时被锁定,那么“临时”锁是有意义的,但是有多个这样的子集,它们应该彼此独立地锁定,或者如果锁应该显式隐藏,那么它就不会以意外的方式锁定/解除锁定。“不要公开您的锁”是使用lombok对锁的@Synchronized注释的专业论据。
https://stackoverflow.com/questions/64152146
复制相似问题