首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Java实现非静态Ad锁

用Java实现非静态Ad锁
EN

Stack Overflow用户
提问于 2020-10-01 09:02:27
回答 1查看 65关注 0票数 0

我正在阅读Cay S. Horstmann写的“核心Java I”一书,他在第577页中提到了这些特殊锁:

有时会发现“临时”锁,例如

代码语言:javascript
复制
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所拥有的锁。

如您所知,锁定是一种阻止其他线程执行特定代码块的机制。如果锁不是静态的(如上面的代码部分所提到的),那么拥有它的锁的任何线程都不知道其他线程的锁。换句话说,为了执行锁,锁在所有其他线程中都是唯一的。根据这个定义,锁应该是静态的吗?

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-01 12:16:46

在您的示例中,锁不是静态的。原因是它不是类的静态值,而是带有static修饰符的。

如果线程“遇到”synchronized块,该线程将尝试获取引用对象。如果没有提供,那么包含该方法的对象将被锁定。这样的锁是特定于对象的,并在线程离开该代码块时返回。

当调用的方法本身是静态的时,静态锁也可能发生:

代码语言:javascript
复制
public static synchronized void soSomething() {
   ...
}

在这些情况下,周围类的Class对象被锁定,这意味着只有一个线程可以访问类中的任何方法,即static synchronized,即使可以在逻辑上同时访问这些方法。

如果一个特定的子集ob功能应该同时被锁定,那么“临时”锁是有意义的,但是有多个这样的子集,它们应该彼此独立地锁定,或者如果锁应该显式隐藏,那么它就不会以意外的方式锁定/解除锁定。“不要公开您的锁”是使用lombok对锁的@Synchronized注释的专业论据。

https://projectlombok.org/features/all

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64152146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档