AtomicReference原子引用类-线程安全

简介与作用:

AtomicReference是Java中的一个原子类,它的主要作用是提供了一种原子操作的方式来更新对象的引用。它通常用于多线程环境下,用来解决并发访问共享对象时可能出现的竞态条件问题。
(实际开发中用于某个数据模型更新,确保一致性和线程安全,多个线程同时更新只有一个线程能够成功执行,其它线程需要等待后继续尝试更新,例如:计算总分(获取答题表分数)并更新到答案表中)

  • 原子性更新引用: AtomicReference可以确保在多线程环境下,对对象引用的更新操作是原子的,即要么更新成功,要么失败,不存在中间状态。这有助于避免多线程同时修改同一对象引用时可能出现的数据不一致性问题。
  • 解决竞态条件问题: 在多线程编程中,如果多个线程同时尝试更新共享对象的引用,可能会导致不可预测的结果。使用AtomicReference可以防止这种情况发生,确保只有一个线程能够成功更新引用。
  • 实现非阻塞算法: AtomicReference可以用于实现非阻塞算法,这些算法通常比基于锁的算法具有更好的性能和可伸缩性,特别是在高并发情况下。
  • 并发数据结构的实现: AtomicReference常常用于实现各种并发数据结构,如并发队列、并发映射等,以确保对这些数据结构的操作是线程安全的。

测试:

原子引用:
原子引用是一种保证在多线程环境下对引用类型的原子操作的机制。这意味着对原子引用的操作(如更新、比较并交换等)在多线程环境中是线程安全的,它们会以原子方式执行,即这些操作在执行过程中不会被其他线程打断。

    @Testpublic void cs3() throws InterruptedException {AtomicReference<Integer> atomicRef = new AtomicReference<>(0);int numThreads = 10;int numIncrements = 1000;// 创建一个线程池,包含10个线程    ExecutorService executorService = Executors.newFixedThreadPool(numIncrements);// 测试原子引用    
// 每个线程对AtomicReference进行1000次增量操作  for (int i = 0; i < numThreads; i++) {executorService.submit(() -> {for (int j = 0; j < numIncrements; j++) {atomicRef.updateAndGet(value -> value + 1);System.out.println(Thread.currentThread().getName() + " : " + atomicRef.get());}});}executorService.shutdown();executorService.awaitTermination(10, TimeUnit.SECONDS);// 等待线程池执行结束  // 输出最终的值    System.out.println("AtomicReference的值: " + atomicRef.get());}@Testpublic void cs4() throws InterruptedException {final Integer[] cs = {0};int numThreads = 10;int numIncrements = 1000;// 创建一个线程池,包含10个线程    ExecutorService executorService = Executors.newFixedThreadPool(numThreads);// 每个线程对int进行1000次增量操作  for (int i = 0; i < numThreads; i++) {executorService.submit(() -> {for (int j = 0; j < numIncrements; j++) {cs[0] = cs[0] + 1;System.out.println(cs[0]);}});}executorService.shutdown();executorService.awaitTermination(10, TimeUnit.SECONDS);// 等待线程池执行结束  // 输出最终的值    System.out.println("线程不安全原子的值: " + cs[0]);}

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/217013.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【pandas】数据透视表【pivot_table】

pivot_table pandas的pivot_table函数是一个非常有用的工具&#xff0c;用于创建一个数据透视表&#xff0c;这是一种用于数据总结和分析的表格形式。 以下是pivot_table的基本语法&#xff1a; pandas.pivot_table(data, valuesNone, indexNone, columnsNone, aggfuncmean,…

Python---函数的参数类型----位置参数(不能顺序乱)、关键词参数(键值对形式,顺序可乱)

位置参数 理论上&#xff0c;在函数定义时&#xff0c;可以为其定义多个参数。但是在函数调用时&#xff0c;也应该传递多个参数&#xff0c;正常情况&#xff0c;要一一对应。 相关链接&#xff1a;Python---函数的作用&#xff0c;定义&#xff0c;使用步骤&#xff08;调用…

OpenCV- 学习笔记(Python)图像处理基础

本专栏&#xff1a;主要记录OpenCV&#xff08;Python&#xff09;学习笔记 OpenCV 图像处理基础 灰度图 import cv2 #opencv读取的格式是BGR import numpy as np import matplotlib.pyplot as plt#Matplotlib是RGB %matplotlib inline ​ imgcv2.imread(cat.jpg) img_gray…

Leetcode—94.二叉树的中序遍历【简单】

2023每日刷题&#xff08;四十&#xff09; Leetcode—94.二叉树的中序遍历 C语言实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ /*** Note: The returned array mus…

FFmpeg零基础学习(一)——初步介绍与环境搭建

目录 前言正文一、开发环境二、搭建环境三、测试代码End、遇到的问题2、Qt 在线安装容易报错&#xff0c;断开问题1、在线安装QMaintainTool很慢2、Qt5.15 无法调试FFmpeg 参考 前言 FFmpeg是一个开源的跨平台多媒体处理框架&#xff0c;它包含了一组用于处理音频、视频、字幕…

Python函数式编程:让你的代码更优雅更简洁

概要 函数式编程&#xff08;Functional Programming&#xff09;是一种编程范式&#xff0c;它将计算视为函数的求值&#xff0c;并且避免使用可变状态和循环。 函数式编程强调的是函数的计算&#xff0c;而不是它的副作用。 在函数式编程中&#xff0c;函数是第一类公民&a…

路由器DHCP分配IP地址规则

路由器DHCP分配IP地址的机制&#xff1a; 先设置一个IP地址池&#xff0c;假设是192.168.1.100-192.168.1.199一共100个。 来一个请求&#xff0c;看一下是不是以前请求过的地址&#xff0c;如果是&#xff0c;还是返回以前给过的IP&#xff0c;然后将到期时间(有些路由器默认…

XShell新建会话指南

XShell新建会话 我们先登录我们的xshell&#xff0c;连接我们的远程服务器 为了方便我们以后的使用&#xff0c;我们可以新建一个会话记住用户 新建好后&#xff0c;我们可以打开这个会话 我们选择记住用户名 然后继续输密码就可以了 之后我们每次打开xshell的时候&#xff0c…

机器学习与因果推断的高级实践 | 数学建模

文章目录 因果推断因果推断的前世今生&#xff08;1&#xff09;潜在结果框架&#xff08;Potential Outcome Framework&#xff09;&#xff08;2&#xff09;结构因果模型&#xff08;Structual Causal Model&#xff0c;SCM&#xff09; 身处人工智能爆发式增长时代的机器学…

计算机编程零基础编程学什么语言,中文编程工具构件简介软件下载

计算机编程零基础编程学什么语言&#xff0c;中文编程工具构件简介软件下载 给大家分享一款中文编程工具&#xff0c;零基础轻松学编程&#xff0c;不需英语基础&#xff0c;编程工具可下载。 这款工具不但可以连接部分硬件&#xff0c;而且可以开发大型的软件&#xff0c;象如…

哨兵1号回波数据(L0级)包格式解析与成像参数提取

坑爹的格式,具体有多坑往下看就知道了。matlab代码在文末。 先上首字母缩写: 再来回波数据包的格式图 1. 数据包格式 众所周知,解包的第一步是找帧头和帧长,找到第4~5字节,帧长码为“0x3761”,转十进制为14777,然而实际第一帧整帧的长度是14184。。。你要是加6我还能…

网络和Linux网络_5(应用层)HTTP协议(方法+报头+状态码)

目录 1. HTTP协议介绍 1.1 URL介绍 1.2 urlencode和urldecode 1.3 HTTP协议格式 1.4 HTTP的方法和报头和状态码 2. 代码验证HTTP协议格式 HttpServer.hpp 2.2 html正式测试 Util.hpp index.html 2.3 再看HTTP方法和报头和状态码 2.3.1 方法_GET和POST等 2.3.2 报头…