单调法

可可

我需要一种总是在一个实例中执行的方法。例如,从不同的类实例和不同的线程同时调用此方法。在这种情况下,尽管它们是从不同的实例调用的,但它们应该一次而不是同时执行。我不能使它只是静态的和同步的,因为它有很多内部代码,不能重构为静态的代码。现在,我有了下一个想法:

private static Boolean isMethodRun = false;

public void singletoneMethod() {
        synchronized(Boolean) {
            if (!isMethodRun) {
            isMethodRun = true;
            } else {
                for (int i = 0; i < 10; i++) {
                    if (isMethodRun) {
                        Thread.sleep(2_000);
                    } else {
                        isMethodRun = true;
                        break;
                    }
                }
            }
        }
        try {
            //inner code
        } catch (Throwable e) {
            //logs
            throw e;
        } finally {
            isMethodRun = false;
        }
    }

有没有更漂亮的方法来获得这种功能

安迪·特纳(Andy Turner)

最简单的方法是同步该方法。由于您似乎已定义了isMethodRunstatic变量,因此您似乎希望在静态对象上进行同步:

private static final Object lock = new Object();

public void singletoneMethod() {
  synchronized (lock) {
    // The code you want only to execute one-at-a-time.
  }
}

您可能已经在类上进行了同步synchronized (WhateverYourClass.class)--但这很容易受到JVM中任何人在其他地方进行类同步的影响。使用这种不可访问的Object方法更可靠。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章