0

0

Java 中构建线程安全的 Atomic POJO

花韻仙語

花韻仙語

发布时间:2025-07-09 17:00:02

|

630人浏览过

|

来源于php中文网

原创

java 中构建线程安全的 atomic pojo

本文将介绍如何在 Java 中构建线程安全的 Atomic POJO。 java.util.concurrent.atomic 包提供了一系列原子类,如 AtomicInteger 和 AtomicBoolean,用于处理线程安全问题。 如果需要创建具有类似原子属性的 POJO,可以借助 AtomicReferenceFieldUpdater、AtomicIntegerFieldUpdater 和 AtomicLongFieldUpdater 类来实现。

使用 AtomicFieldUpdater 实现原子性

Java 并发包 (J.U.C) 提供了 AtomicReferenceFieldUpdater 类,它可以用于原子性地更新对象的属性。对于 Integer 和 Long 类型的数据,可以使用 AtomicIntegerFieldUpdater 和 AtomicLongFieldUpdater。

以下示例展示了如何使用 AtomicReferenceFieldUpdater 来实现线程安全的 POJO。

1. 定义 POJO 类

首先,定义一个 POJO 类,并使用 volatile 关键字修饰需要进行原子性更新的属性。volatile 关键字确保了多线程环境下变量的可见性,即一个线程对变量的修改会立即反映到其他线程。

立即学习Java免费学习笔记(深入)”;

public class UserPojo {
  volatile String userName;
  volatile String password;

  public void setPassword(String password){
    this.password = password;
  }

  public void setUserName(String userName){
    this.userName = userName;
  }

  public String getUserName(){
    return this.userName;
  }

  public String getPassword(){
    return this.password;
  }
}

注意: volatile 关键字是必要的,它保证了字段的可见性,是 AtomicReferenceFieldUpdater 正确工作的先决条件。

千博购物系统.Net
千博购物系统.Net

千博购物系统.Net能够适合不同类型商品,为您提供了一个完整的在线开店解决方案。千博购物系统.Net除了拥有一般网上商店系统所具有的所有功能,还拥有着其它网店系统没有的许多超强功能。千博购物系统.Net适合中小企业和个人快速构建个性化的网上商店。强劲、安全、稳定、易用、免费是它的主要特性。系统由C#及Access/MS SQL开发,是B/S(浏览器/服务器)结构Asp.Net程序。多种独创的技术使

下载

2. 使用 AtomicReferenceFieldUpdater 进行测试

接下来,创建一个测试类,使用 AtomicReferenceFieldUpdater 来更新 UserPojo 对象的 userName 属性。

import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;

public class Test {

  public static void main(String[] args){
    //create updater
    final AtomicReferenceFieldUpdater updater = AtomicReferenceFieldUpdater.newUpdater(UserPojo.class, String.class, "userName");
    //UserPojo instance
    UserPojo user = new UserPojo();
    String userName = "vickllny";
    user.setUserName(userName);
    //10 threads
    for (int i = 0; i < 10; i++) {
        final int count = i;
        new Thread(() -> {
            //cas update
            updater.compareAndSet(user, userName, userName + count);
        }).start();
    }

    //Wait for the thread to finish executing
    try {
        TimeUnit.SECONDS.sleep(3);
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }

    System.out.println("Final userName: " + user.getUserName()); // 输出最终的 userName
  }
}

在这个例子中,AtomicReferenceFieldUpdater.newUpdater() 方法用于创建一个 AtomicReferenceFieldUpdater 实例。需要传入 POJO 类的 Class 对象、属性的类型以及属性的名称。

updater.compareAndSet(user, userName, userName + count) 方法使用 CAS (Compare and Swap) 操作来原子性地更新 userName 属性。如果当前 userName 的值与期望值 userName 相等,则将其更新为 userName + count。

注意事项

  • 可见性: 确保使用 volatile 关键字修饰需要进行原子性更新的属性,以保证线程间的可见性。
  • 性能: 原子操作通常比锁的开销更小,但在高并发场景下,过度使用原子操作可能会导致 CPU 竞争,影响性能。需要根据实际情况进行权衡。
  • 适用性: AtomicFieldUpdater 适用于已经存在的类的字段的原子性更新。如果需要创建全新的原子类型,可以考虑直接使用 java.util.concurrent.atomic 包提供的原子类。
  • 反射权限: AtomicReferenceFieldUpdater 本质上是基于反射实现的,因此需要注意相关的安全权限问题。 如果POJO的字段是private的,那么调用者必须具有访问private字段的权限。

总结

通过使用 AtomicReferenceFieldUpdater、AtomicIntegerFieldUpdater 和 AtomicLongFieldUpdater 类,可以方便地为 POJO 添加原子性更新的能力,从而在并发环境下保证数据的一致性和线程安全。 在设计线程安全的 POJO 时,需要仔细考虑哪些属性需要进行原子性更新,并选择合适的原子类或 AtomicFieldUpdater。 同时,也要注意 volatile 关键字的使用,以及原子操作对性能的影响。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

198

2023.11.20

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

198

2023.11.20

c++中volatile关键字的作用
c++中volatile关键字的作用

本专题整合了c++中volatile关键字的相关内容,阅读专题下面的文章了解更多详细内容。

69

2025.10.23

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

469

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

13

2025.12.06

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

502

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

166

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

10

2026.01.21

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

24

2026.01.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号