21xrx.com
2024-12-27 20:24:44 Friday
登录
文章检索 我的文章 写文章
Java多线程中如何确保代码仅被执行一次?
2023-07-05 08:28:52 深夜i     --     --
Java 多线程 代码执行 仅执行一次

在Java多线程应用程序中,有时需要确保某个代码块只能被执行一次。比如,只允许创建一个单例对象,或者在程序启动时只初始化一次资源等场景。这就需要使用一些特殊的技巧来实现这一目标。

一种常见的方法是使用synchronized关键字。我们可以将代码块包裹在synchronized块中,并使用一个标志变量来判断是否已经被执行过。例如,下面是一个使用synchronized实现单例模式的示例代码:


public class Singleton {

  private static volatile Singleton instance;

  private static boolean isInitialized = false;

  private Singleton() {}

  public static Singleton getInstance() {

    if (instance == null) {

      synchronized (Singleton.class) {

        if (instance == null) {

          instance = new Singleton();

        }

      }

    }

    return instance;

  }

  public void initialize() {

    synchronized (Singleton.class) {

      if (!isInitialized)

        // 初始化操作

        isInitialized = true;

      

    }

  }

}

在上面的代码中,我们加了两个synchronized块。第一个是在getInstance()方法中,用于确保只创建一个单例对象。第二个是在initialize()方法中,用于确保在程序启动时只初始化一次资源。

另一种方法是使用AtomicBoolean类,它提供了原子性的布尔变量操作,可以确保对它的修改是原子的。我们可以在代码中使用一个AtomicBoolean变量来判断代码是否已经被执行过。例如:


public class MyClass {

  private static AtomicBoolean isExecuted = new AtomicBoolean(false);

  public void myMethod() {

    if (isExecuted.compareAndSet(false, true))

      // 只执行一次的代码块

    

  }

}

在上面的代码中,myMethod()方法中的代码块只会被执行一次,因为compareAndSet()方法会先判断isExecuted的值是否为false,如果是,则将其设置为true,并返回true,表示成功执行了这段代码块。如果isExecuted的值已经是true了,则不执行这段代码,并返回false。

以上两种方法都可以保证代码只被执行一次。需要根据具体场景选择合适的方法。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复