【问题标题】:Identify if the code in execution right now is inside a synchronized block确定当前正在执行的代码是否在同步块内
【发布时间】:2021-08-01 19:54:34
【问题描述】:

我有一个要求,我想确保如果从类中调用特定方法“Repo.get()”,则应该在同步块(或同步方法)内调用它。我可以修改“Repo.get()”。但我无法修改调用类。

查看以下示例:

class A {
    public void testA() {
        Repo r = new Repo();
        synchronized (this) {
            r.get();
        }
    }
}

class B {
    public void testB() {
        Repo r = new Repo();
        r.get();
    }
}

class Repo {
    public void get() {
        // My code goes here.
        // When called from A, we should be able to print "YES"
        // When called from B, we should be able to print "NO"
    }
}

我们怎样才能做到这一点?

谢谢, 尼基尔

【问题讨论】:

  • 您的代码打破了同步的基本概念,即要么对不同线程的同一个对象进行同步,要么通过持有整个类的锁来进行静态同步。还有其他概念,例如锁、信号量,但这是您必须首先了解的。

标签: java multithreading synchronization synchronized


【解决方案1】:

它应该在同步块(或同步方法)中被调用。

这是一个无意义的要求。因为我可以轻而易举地坚持完成绝对不是一件事。

synchronized (new Object()) {
   // this does absolutely nothing
}

除了与同一对象引用上的其他同步块进行交互之外,同步块什么也不做。因此,要求使用“同步”是没有意义的。要求“在此特定 X 上使用同步”是有意义的。

根据定义,上面的代码什么都不做,因为它在一个其他线程可能无法引用的对象上进行同步,从而保证它完全没用,这证明你的要求是愚蠢的。

如果你想升级到不傻的要求('必须专门同步这个对象引用'):

Thread.holdsLock(objRef) 就是你所需要的。

如果你想检查当前线程是否持有 any 锁,好吧,这实际上是不可能的,但这是不可能的,因为这将是一件愚蠢的事情想做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 2018-11-29
    • 2019-02-26
    • 1970-01-01
    相关资源
    最近更新 更多