当前位置: 首页 > article >正文

深入理解Java并发编程中的原子操作、volatile关键字与读写锁

1. 原子操作与AtomicInteger等原子类

1.1 原子操作的原理

在多线程环境中,多个线程可能会同时访问和修改共享资源。如果这些操作不是原子性的(即可以被中断),那么可能会导致数据不一致或竞态条件(race condition)。原子操作是指不可分割的操作,即在多线程环境下,这些操作不会被其他线程打断。

Java提供了java.util.concurrent.atomic包来支持原子操作,底层通过CPU提供的CAS(Compare-And-Swap)指令实现。CAS是一种无锁算法,它通过比较内存位置的值是否等于预期值,如果是,则更新为新值;否则,重试直到成功。

CAS的优点:

  • 避免了传统锁机制带来的阻塞问题。
  • 提高了并发性能,特别是在竞争不激烈的情况下。

CAS的缺点:

  • ABA问题:当一个变量从A变为B再变回A时,CAS会误认为没有变化。
  • 循环时间长开销大:如果CAS操作失败,需要不断重试,可能导致较高的CPU开销。

1.2 AtomicInteger类详解

AtomicInteger是Java中常用的原子类之一,它提供了一系列原子操作方法,如get()set()incrementAndGet()decrementAndGet()等。这些方法确保了在多线程环境下的线程安全性。

常用方法:

  • int get(): 获取当前值。
  • void set(int newValue): 设置为给定值。
  • int incrementAndGet(): 将当前值加1并返回新的值。
  • int decrementAndGet(): 将当前值减1并返回新的值。
  • int addAndGet(int delta): 将当前值增加指定的增量并返回新的值。
  • boolean compareAndSet(int expect, int update): 如果当前值等于预期值,则设置为新值,并返回true;否则返回false。

示例代码:

import java.util.concurrent.atomic.AtomicInteger;

public class AtomicIntegerExample {
   
    private static AtomicInteger counter = new AtomicInteger(0);

    public static void main(String[] args) throws InterruptedException {
   
        Thread t1 = new Thread(() -> {
   
            for (int i = 0; i < 1000; i++) {
   
                counter.incrementAndGet();
            }
        });

        Thread t2 = 

http://www.kler.cn/a/525719.html

相关文章:

  • 青少年编程与数学 02-008 Pyhon语言编程基础 07课题、数字
  • 解锁微服务:五大进阶业务场景深度剖析
  • 一文讲解Java中的BIO、NIO、AIO之间的区别
  • Helm Chart 实战指南
  • 【python】subprocess.Popen执行adb shell指令进入linux系统后连续使用指令,出现cmd窗口阻塞问题
  • gitee——报错修改本地密码
  • 手写MVVM框架-环境搭建
  • C#方法(练习)
  • rsync安装与使用-linux015
  • 2025最新版MySQL安装使用指南
  • android 圆形弹窗摄像头开发踩坑——源码————未来之窗跨平台操作
  • VS2008 - debug版 - 由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题。
  • 你的连接不是专用连接
  • 信息学奥赛一本通 1606:【 例 1】任务安排 1 | 洛谷 P2365 任务安排
  • Web-3.0(Solidity)基础教程
  • 【PySide6拓展】QWindowCapture
  • AI在自动化测试中的伦理挑战
  • 【Unity3D】实现横版2D游戏——单向平台(简易版)
  • 31【api接口】
  • 构建具身智能体的时空宇宙!GRUtopia:畅想城市规模下通用机器人的生活图景
  • Effective Objective-C 2.0 读书笔记——关联对象
  • Node.js MySQL:深度解析与最佳实践
  • 程序代码篇---Python随机数
  • 【Java】微服务找不到问题记录can not find user-service
  • 每日一题——序列化二叉树
  • Python3 【集合】水平考试:精选试题和答案