随笔 - 750  文章 - 1  评论 - 107  阅读 - 34万

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

来自:阿里的 通义灵码

要确保在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则分别利用内置锁和原子操作保证操作的原子性和可见性,适用于简单场景。

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

posted on   z5337  阅读(203)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2017-04-29 [Java.Web] Servlet 的一些细节
2017-04-29 [Java.Web]Tomcat 常用配置
2017-04-29 [Java.Web]从零开始布署 Tomcat
2014-04-29 [转] oracle 数据库 SQL plus 连接方法
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示