首页 > 编程语言 >【转】[Java] 防止并发的多种写法

【转】[Java] 防止并发的多种写法

时间:2024-04-29 16:00:23浏览次数:23  
标签:executed false true private return 并发 Java 写法 public

来自:阿里的 通义灵码

要确保在Java中同一方法被多个线程同时调用时,只有其中一个成功执行,可以采用几种并发控制策略。以下是几种实现方式:

1. 使用ReentrantLock的tryLock()

import java.util.concurrent.locks.ReentrantLock;

public class SingletonExecution {
    private static final ReentrantLock lock = new ReentrantLock();

    public boolean executeOnce() {
        // 尝试获取锁,如果已经锁住则立即返回false,否则获取锁并执行
        if (lock.tryLock()) {
            try {
                // 执行业务逻辑
                performAction();
                return true; // 成功执行
            } finally {
                lock.unlock(); // 确保锁被释放
            }
        } else {
            // 锁已被其他线程持有,表示已有其他调用者成功
            return false;
        }
    }

    private void performAction() {
        // 实际执行的业务逻辑
    }
}

2. 使用synchronized和标志位

public class SingletonExecution {
    private static boolean executed = false;

    public synchronized boolean executeOnce() {
        if (!executed) {
            // 执行业务逻辑
            performAction();
            executed = true;
            return true;
        }
        return false; // 已经有其他线程执行过了
    }

    private void performAction() {
        // 实际执行的业务逻辑
    }
}

3. 使用AtomicBoolean和CAS操作

import java.util.concurrent.atomic.AtomicBoolean;

public class SingletonExecution {
    private static final AtomicBoolean executed = new AtomicBoolean(false);

    public boolean executeOnce() {
        // 使用CAS操作,如果executed为false则设置为true并返回true,否则返回false
        return executed.compareAndSet(false, true);
    }

    // 这里可以添加执行的业务逻辑方法
}

每种方法都有其适用场景。使用tryLock()提供了非阻塞的尝试获取锁的方式,适合于那些不希望线程等待的情况。

synchronizedAtomicBoolean则分别利用内置锁和原子操作保证操作的原子性和可见性,适用于简单场景。

选择时应考虑具体需求,如是否需要阻塞、性能要求等因素。

标签:executed,false,true,private,return,并发,Java,写法,public
From: https://www.cnblogs.com/z5337/p/18165955

相关文章

  • openGauss MOT并发控制机制
    MOT并发控制机制通过大量研究,我们找到了最佳的并发控制机制,结论为:基于SILO[的OCC算法是MOT中最符合ACID特性的OCC算法。SILO为满足MOT的挑战性需求提供了最好的基础。说明:MOT完全符合原子性、一致性、隔离性、持久性(ACID)特性,如MOT简介所述。下面介绍MOT的并发控制机制。......
  • 2-LinuxJava安装
    环境CentOS7.5Java8卸载现有JDKrpm-qa|grep-ijava|xargs-n1sudorpm-e--nodseps上传Java压缩包将jdk-8u212-linux-x64.tar文件上传到/opt/software目录中解压Java压缩包进入/opt/software目录cd/opt/software解压缩文件到指定目录tar......
  • Java方法
    基本类型和引用类型的不同对于基本类型,它的值直接保存在变量中;对于引用类型,它保存的是实际对象的地址,引用指向实际对象,实际对象中保存着内容;赋值运算符对基本类型与引用类型的作用对于基本类型,赋值运算符会直接改变变量的值,原来的值会被覆盖掉;对于引用数据类型,赋值运算符会......
  • java代码运行出现DENIED Redis is running in protected mode because protected mode
    这个错误是因为开启了保护模式,导致出错。所以需要关闭redis的保护模式。编辑redis的redis.config  注释bind127.0.0.1 、修改protected-mode为no、修改 daemonize为no然后重启redis ......
  • mORMot 1.18 第08章 Delphi中的服务器端JavaScript
    mORMot1.18第8章Delphi中的服务器端JavaScript在mORMot框架中,对JavaScript脚本的支持被称为MonkeyOnRails(版权归PavelMashlyakovsky所有,邮箱:[email protected]),它借助了Mozilla基金会的SpiderMonkey类。mORMot允许程序员编写功能强大的应用程序,但如果客户希望自定义应用......
  • javac编译java后缀编成class
    前言全局说明一、编译独立.java后缀文件此java文件,没有依赖外部任何jar包。文件名:test_print.javapublicclasstest_print{publicstaticvoidmain(String[]args){if(args.length==1){System.out.println("[INFO]Userargs:"+args[......
  • Java线程池控制线程存活时间的机制
    核心线程:永不销毁:此类线程处理完任务后,会调用任务队列的take方法,此方法是阻塞的,假如队列为空了,该线程就会被阻塞住,线程就能一直存活着了。非核心线程:空闲指定时间后,会被销毁:此类线程处理完任务后,会通过调用任务队列的pop方法,此方法接收一个时间参数且是限时阻塞的,假如队......
  • 顶级 Javaer 都在用的 20 个类库,真香!
    优秀且经验丰富的Java开发人员的特征之一是对API的广泛了解,包括JDK和第三方库。我花了很多时间来学习API,尤其是在阅读了EffectiveJava3rdEdition之后,JoshuaBloch建议在Java3rdEdition中使用现有的API进行开发,而不是为常见的东西编写新的代码。这对我来说很有意义,因为这些......
  • Java 线程Dump分析
    一般当服务器挂起,崩溃或者性能低下时,就需要抓取服务器的线程堆栈(ThreadDump)用于后续的分析。在实际运行中,往往一次dump的信息,还不足以确认问题。为了反映线程状态的动态变化,需要接连多次做threaddump,每次间隔10-20s,建议至少产生三次dump信息,如果每次dump都指向同一个问题,我们......
  • java平均值
    packagecyh;classCalculator{publicstaticdoublecalculateAverage(int[]numbers){intsum=0;for(inti=0;i<numbers.length;i++)sum+=numbers[i];returnsum/(double)numbers.length;}pu......