繁体   English   中英

嵌套的“同步”:如何重构这个同步的 Java 方法——这样是否有意义?

[英]Nested 'synchronize': How can this synchronized Java method be refactored - and could it make any sense like this?

我在我正在进行的一个项目中偶然发现了这种方法,并立即认为有问题。 我有一种感觉,这对于任何事情来说都不是任何适当的习惯用法。

但我不明白这的意图和含义。 这可以重构吗? 第二个同步是否有意义 - 第三个同步不是多余/不必要的吗?

我刚刚开始使用 Java 进行高级并发/线程安全编程 - 详细解释为什么这有意义或没有意义以及为什么非常感谢!

 @Override
    public synchronized void run() {
        synchronized (this.market) {
            synchronized (this.market.getWallet()) {
                this.handler.handleEvent(new WalletLecherEvent(this, market,
                        market.leechWallet()));
            }
        }
    }

提前致谢

编辑,以提供更多上下文:

public class WalletLeecherWorker extends Worker {
        private IAbstractMarketAPI market = null;

        private Thread thread = null;

        public WalletLeecherWorker(IEventHandler handler, IAbstractMarketAPI market) {
            super(handler);
            this.market = market;
        }

        public void startThread() {
            if (thread != null)
                return;

            thread = new Thread(this);
            thread.start();
        }

        public MARKETs getMarket() {
            return this.market.getName();
        }

        @Override
        public synchronized void run() {
            synchronized (this.market) {
                synchronized (this.market.getWallet()) {
                    this.handler.handleEvent(new WalletLecherEvent(this, market,
                            market.leechWallet()));
                }
            }
        }
    }

..和方法market.getWallet()

@Override
public Wallet getWallet() {
    return this.wallet;
}

认为目的是阻止所有线程获取钱包,从而错误地同步/弃用数据 - 只要该线程运行();

该代码获取以下对象的锁:

  • this - 防止多个线程在同一个WalletLeecherWorker实例上调用run()
  • this.market - 如果另一个线程获得了对其的锁定,则阻止run()继续进行,考虑到可能共享market实例,这是一个合理的假设
  • this.market.wallet - 与之前相同

除了同步的run()方法之外,这些显然都不是必需的。 除了以下同步块所做的之外,它不提供任何保护。 代码本身可能是因为使用了非常细粒度的锁定,此特定代码需要锁定所有内容,而其他代码可能仅锁定钱包或市场和钱包。

然而,这段代码可能容易出错(甚至死锁)。 如果以错误的顺序锁定对象,则会出现死锁。 如您所见,它的可读性也不是很好。 Thread作为具有startThread()方法的类的实例变量也是值得怀疑的。 代码可能没有被破坏,但它肯定不是很漂亮。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM