【转】[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()
提供了非阻塞的尝试获取锁的方式,适合于那些不希望线程等待的情况。
而synchronized
和AtomicBoolean
则分别利用内置锁和原子操作保证操作的原子性和可见性,适用于简单场景。
选择时应考虑具体需求,如是否需要阻塞、性能要求等因素。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有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 连接方法