首页 > 解决方案 > 单调法

问题描述

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

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;
        }
    }

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

标签: javamethodssingleton

解决方案


最简单的方法是同步该方法。由于您似乎已经定义了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更健壮。


推荐阅读