我需要一种总是在一个实例中执行的方法。例如,从不同的类实例和不同的线程同时调用此方法。在这种情况下,尽管它们是从不同的实例调用的,但它们应该一次而不是同时执行。我不能使它只是静态的和同步的,因为它有很多内部代码,不能重构为静态的代码。现在,我有了下一个想法:
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;
}
}
有没有更漂亮的方法来获得这种功能
最简单的方法是同步该方法。由于您似乎已定义了isMethodRun
static变量,因此您似乎希望在静态对象上进行同步:
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] 删除。
我来说两句