java - 单调法
问题描述
我需要一种始终在一个实例中执行的方法。例如,该方法同时从不同的类实例和不同的线程中调用。在这种情况下,它们应该一次执行一个,而不是同时执行,尽管它们是从不同的实例调用的。我不能让它只是静态和同步的,因为它有很多内部代码,不能重构为静态现在我有下一个想法:
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
变量静态,看起来您希望在静态事物上进行同步:
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
更健壮。
推荐阅读
- javascript - 模块没有导出成员,“请求”
- javascript - Moment .JS - 为什么差异不是全年格式
- javascript - 如何在 Javascript 中使用 ASP 变量?
- ios - 后台任务在持有 WebKit ProcessAssertion 时过期
- c# - 如何在其外部的 WPF 表单内调用函数
- maven - rtMavenDeployer 怎么添加属性?
- javascript - AWS s3 重定向到另一个 s3 存储桶
- c++ - 我可以在其析构函数中使用指向被破坏对象的指针吗?
- c - 子运行exec()后确定父子共享内存区域
- python-3.x - 如何将几个 SQLite3 数据库相互合并