首页 > 编程语言 >并发编程AtomicBoolean详解

并发编程AtomicBoolean详解

时间:2024-07-31 13:25:50浏览次数:15  
标签:false void 编程 running 详解 new AtomicBoolean public

AtomicBoolean 是 Java 中的一种原子变量类,提供了对布尔值进行原子操作的能力。它是 java.util.concurrent.atomic 包的一部分,使用了 CAS(Compare-And-Swap)机制来实现无锁的并发控制。AtomicBoolean 常用于需要以线程安全的方式对布尔值进行读写操作的场景。以下是 AtomicBoolean 的常见使用场景和示例。
常见使用场景
1. 状态标志:

public class Task implements Runnable {
    private final AtomicBoolean running = new AtomicBoolean(false);

    public void start() {
        if (running.compareAndSet(false, true)) {
            new Thread(this).start();
        }
    }

    public void run() {
        while (running.get()) {
            // 执行任务
        }
    }

    public void stop() {
        running.set(false);
    }
}

AtomicBoolean 常用作状态标志,确保多个线程之间可以正确地看到状态的变化。例如,控制一个线程是否应该停止运行。
一次性初始化:

public class Singleton {
    private static final AtomicBoolean initialized = new AtomicBoolean(false);

    public static void initialize() {
        if (initialized.compareAndSet(false, true)) {
            // 执行一次性初始化操作
        }
    }
}

AtomicBoolean 可用于实现一次性初始化操作,确保某个操作在并发环境下只执行一次。
乐观锁:

public class OptimisticLock {
    private final AtomicBoolean lock = new AtomicBoolean(false);

    public boolean tryLock() {
        return lock.compareAndSet(false, true);
    }

    public void unlock() {
        lock.set(false);
    }
}

在一些情况下,AtomicBoolean 可以用来实现乐观锁,防止多个线程同时执行冲突的操作。
控制并发访问:

public class Resource {
    private final AtomicBoolean inUse = new AtomicBoolean(false);

    public void useResource() {
        if (inUse.compareAndSet(false, true)) {
            try {
                // 使用资源
            } finally {
                inUse.set(false);
            }
        } else {
            // 资源正在使用中
        }
    }
}

AtomicBoolean 可以用于控制对资源或代码块的并发访问,确保同一时间只有一个线程可以访问。
非阻塞算法:

public class NonBlockingAlgorithm {
    private final AtomicBoolean flag = new AtomicBoolean(false);

    public void performTask() {
        if (flag.compareAndSet(false, true)) {
            try {
                // 执行任务
            } finally {
                flag.set(false);
            }
        } else {
            // 任务正在执行中
        }
    }
}

AtomicBoolean 常用于实现非阻塞算法,提供一种高效的并发控制手段。
示例代码
以下是一个使用 AtomicBoolean 控制任务执行的示例:

import java.util.concurrent.atomic.AtomicBoolean;

public class TaskController {
    private final AtomicBoolean running = new AtomicBoolean(false);

    public void startTask() {
        if (running.compareAndSet(false, true)) {
            new Thread(() -> {
                while (running.get()) {
                    try {
                        // 模拟任务
                        Thread.sleep(1000);
                        System.out.println("Task is running");
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                    }
                }
            }).start();
        } else {
            System.out.println("Task is already running");
        }
    }

    public void stopTask() {
        running.set(false);
        System.out.println("Task is stopped");
    }

    public static void main(String[] args) throws InterruptedException {
        TaskController controller = new TaskController();
        controller.startTask();
        Thread.sleep(3000);
        controller.stopTask();
    }
}

在这个示例中,AtomicBoolean 用于控制任务的启动和停止,确保任务在并发环境下可以正确地控制其运行状态。
总结
AtomicBoolean 是一种高效的原子变量类,适用于需要以线程安全的方式对布尔值进行操作的场景。它提供了状态标志、一次性初始化、乐观锁、控制并发访问和非阻塞算法等常见使用场景。理解和正确使用 AtomicBoolean,有助于编写高效且正确的并发程序。

标签:false,void,编程,running,详解,new,AtomicBoolean,public
From: https://blog.csdn.net/Fireworkit/article/details/140817342

相关文章

  • 塔子哥的编程乐趣-腾讯2023笔试(codefun2000)
    题目链接塔子哥的编程乐趣-腾讯2023笔试(codefun2000)题目内容塔子哥是一位资深的程序员,他最近在研究一种特殊的数组操作。他有一个由正整数组成的数组,数组的长度是偶数。塔子哥可以对数组中的任意一个数字执行以下两种操作之一:将该数字乘以2;将该数字除以2并向下......
  • 我的编程经历,从天桥地摊Basic到西藏阿里的.Net AOT。(一,从井到Sharp)
    撇清一层歧义:标题中的阿里不是指阿里巴巴集团,喜马拉雅也不是指那个做音频频道的公司,文中所及内容以及我本人都与他们没有任何关联。依照地理正式名称:阿里指的是西藏西部阿里地区,喜马拉雅指的是青藏高原地球最高山脉。 从前我在博客园不叫这个名字,今天很多自己的早期文章我都屏蔽......
  • 继电器模块详解
    继电器,一种常见的电控制装置,其应用几乎无处不在。在家庭生活,继电器被广泛应用于照明系统、电视机、空调等电器设备的控制;在工业领域,它们用于控制电机、泵站、生产线等高功率设备的运行;继电器还在通信网络、交通系统以及医疗设备中发挥着重要作用。不仅如此,继电器也是学习其他电子......
  • Python编程的16个坏习惯
    1、手动进行字符串格式化#坏习惯name="Alice"greeting = "Hello, " + name +"!" #好习惯name="Alice"greeting=f"Hello,{name}!" 理由:使用+进行字符串拼接会导致代码可读性差,而且在复杂情况下容易出错,f-string可读性更好 2、手动关闭文件#坏习惯......
  • 编程基础四大件
    简述在计算机这个领域中,比编程语言更重要的是基础四大件:数据结构和算法计算机网络计算机操作系统&计算机组成原理设计模式再次强调,编程基础4大件比编程语言本身要重要的多,如果你是某门语言的初学者,如果你掌握了一门编程语言并想提升编程能力,如果你正跋涉于计算机领域的行......
  • Mojo 编程语言:AI开发者的新宠儿
    在人工智能(AI)技术日新月异的今天,编程语言作为AI研究与应用的基石,其重要性不言而喻。随着AI应用的深入和复杂度的提升,开发者对于编程语言的性能、易用性、灵活性以及与AI框架的集成度等方面提出了更高的要求。正是在这样的背景下,一个名为“Mojo”的假设性编程语言逐渐崭露头角,......
  • 神经网络之卷积篇:详解计算机视觉(Computer vision)
    详解计算机视觉计算机视觉是一个飞速发展的一个领域,这多亏了深度学习。深度学习与计算机视觉可以帮助汽车,查明周围的行人和汽车,并帮助汽车避开它们。还使得人脸识别技术变得更加效率和精准,即将能够体验到或早已体验过仅仅通过刷脸就能解锁手机或者门锁。当解锁了手机,猜手机上一定......
  • PMSM电机方程详解
    一.dq轴下的电机方程1.电机方程分类做PMSM驱动,大家一定知道两个坐标系:αβ坐标系和dq坐标系。αβ坐标系,基于电机定子而言,所以又称定子坐标系或者静态坐标系。dq坐标系,基于电机转子而言,所以又称转子坐标系或者旋转坐标系。于是,在这两个坐标系下,就分别对应着各自的电机方程......
  • Linux应用编程——TCP实现文件传输
    1、常用编程接口1.1socket函数创建一个套接字intsocket(intdomain,inttype,intprotocol);入参:domain:协议族,如AF_INET表示IPv4。type:套接字类型,如SOCK_STREAM表示TCP套接字。protocol:协议,一般为0。返回值:成功时返回新创建的套接字的文件描述符,失败时返回-1。......
  • 全网最适合入门的面向对象编程教程:28 类和对象的Python实现-Python编程原则、哲学和规
    全网最适合入门的面向对象编程教程:28类和对象的Python实现-Python编程原则、哲学和规范大汇总摘要:本文主要介绍了在使用Python进行面向对象编程时,Python异常处理的原则-“请求谅解,而非许可”,以及软件设计和Python的编程原则,同时介绍了PEP8规范。原文链接:FreakStud......