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

多线程中的一堆Atom和synchronized

先说说Atom,它的存在是为了保证操作原子性,就是确保就是我修改的是我应该的修改,如果有谁干扰了,我就不干了,大概是这意思

先来个图

image

 这里来做个解释哈

第一步,两个线程都读到旧值 0

第二步,线程 1 先 CAS 成功

第三步,线程 0 再 CAS

第四步,线程 0 重新读取

所以才会有上面的情况,因为这是为了确保修改的时候不会被干扰,不然数据不对了

因为使用atom是直接找地址拿到最新的数据来比较,同时拿到修改完成是原子性一次性完成,所以不会存在外界的干扰

代码部分

package com.java.test260428;import lombok.extern.slf4j.Slf4j;import java.util.concurrent.atomic.AtomicInteger;/*** @Description:* @Author: tutu-qiuxie* @Create: 2026/4/28 15:43*/
@Slf4j
public class AtomTest {private static AtomicInteger count=new AtomicInteger(0);public static void main(String[] args) {for (int i = 0; i < 2; i++) {new Thread(() -> {while (true) {int old = count.get();int newVal = old + 1;// 故意放慢,增加冲突概率try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}if (count.compareAndSet(old, newVal)) {log.info(Thread.currentThread().getName() + "--------------------------成功: " + newVal);break;} else {log.info(Thread.currentThread().getName() + " CAS失败,重试");}}}).start();}}
}

  这里希望大家可以了解,加入休眠时间,是为了展示cas报错的现象

image

 但是你要明白,如果有 1000 个线程同时对同一个 AtomicInteger 做加一。

这时候只有一个线程能 CAS 成功,其他线程可能失败,然后不断重试。

因此使用atom是有特定的场景的

计数,状态标记,

如果只是做高并发计数,推荐 LongAdder

image

 你看即使我休眠了也不会出问题了

代码部分

package com.java.test260428;import java.util.concurrent.atomic.LongAdder;/*** @Description:* @Author: tutu-qiuxie* @Create: 2026/4/28 16:29*/
public class LongAdderTest {private static LongAdder count = new LongAdder();public static void main(String[] args) {for (int i = 0; i < 100; i++) {new Thread(() -> {// 故意放慢try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}count.increment();System.out.println(Thread.currentThread().getName()+ " 成功: " + count.sum());}).start();}}
}

  那为啥LongAdder可以,那是因为它做到了"不要让所有线程都去抢同一个变量,而是把热点分散到多个变量上"

image

 但是LongAdder分散了竞争,你可以这样理解

image

 最后做个汇总,但是各有各的特点

你可以使用LongAdder

接口访问次数
请求总数
成功次数
失败次数
日志计数
监控指标
点赞数量统计

  但是它不适合返回递增后的精确值,需要精确值还是要用atom

下面给个两者对比

image

 好了,说完这个,开始简单说下synchronized

先来个图

image

 刚开始使用处于无锁状态

image

 已经为轻量锁了

image

 成为重度锁了,我们可以看到synchronized在使用过程中是不断变化的,

代码部分

package com.java.test260428;import lombok.extern.slf4j.Slf4j;
import org.openjdk.jol.info.ClassLayout;/*** @Description:* @Author: tutu-qiuxie* @Create: 2026/4/28 21:38*/
@Slf4j
public class LockStateDemo {static final Object lock = new Object();public static void main(String[] args) throws Exception {log.info("1. 初始状态");printLock();Thread.sleep(5000);log.info("2. 可能进入偏向锁之前的状态");printLock();synchronized (lock) {log.info("3. 第一次 synchronized 内部");printLock();}log.info("4. synchronized 结束之后");printLock();Thread t1 = new Thread(() -> {synchronized (lock) {log.info("5. 线程 t1 获取锁");printLock();try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}log.info("6. 线程 t1 即将释放锁");printLock();}});Thread t2 = new Thread(() -> {try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}synchronized (lock) {log.info("7. 线程 t2 获取锁");printLock();}});t1.start();t2.start();t1.join();t2.join();log.info("8. 所有线程结束之后");printLock();}static void printLock() {log.info(ClassLayout.parseInstance(lock).toPrintable());}}

  

image

 

-XX:+UseBiasedLocking -XX:BiasedLockingStartupDelay=0

  

 

http://www.jsqmd.com/news/716156/

相关文章:

  • 2026年最新:英文降ai率怎么做?实测从95%降到0%的5款工具与3大手改技巧 - 殷念写论文
  • 我的博客园记忆:那片代码与文字交织的绿洲 - 年度推荐企业名录
  • 生图新王GPT Image 2正式发布!彻底告别中文乱码,附无魔法国内稳定渠道
  • 3大实战技巧:用Source Han Serif CN打造专业级中文排版
  • 2026机械制造品牌推广服务商权威横评:哪家专业机构更值得合作? - GEO优化
  • 别再只用2D地图了!手把手教你用Vue3+ECharts GL打造可交互的3D中国地图(附完整代码和天空盒资源)
  • 3分钟掌握Onekey:Steam游戏清单自动化下载完整指南
  • 论文急救降AI推荐:高性价比工具看速度+效果+承诺3维度毕业生必看! - 我要发一区
  • 【Linux从入门到镜头】第29篇:文本处理三剑客(下)——awk 数据处理神器
  • # AI 领域「好马配好鞍」——Harness 工程化核心清单
  • Day56数组reduce方法
  • 香港启世集团宣布即将发布人工光合作用突破性技术 - 速递信息
  • 终极Windows系统优化指南:如何用Win11Debloat让电脑飞起来
  • ImageGlass:Windows平台终极开源图像浏览解决方案,高效支持90+格式
  • #P4227.第2题-动态注意力掩码调度问题
  • GVINS深度解析:港科大如何用GNSS紧耦合解决VINS的累计漂移难题?
  • 降AI软件8元和4元差在哪?速度/效果/售后5维度横评不再纠结! - 我要发一区
  • 知网过AIGC检测怎么花得值?综合性价比高的降AI软件推荐毕业生! - 我要发一区
  • 期刊推荐:Journal of Artificial Intelligence and Soft Computing Research(ISSN: 2083-2567)
  • 【技术干货】打破协议壁垒:基于 GB28181/RTSP 的 AI 视频管理平台架构解析(附源码交付与边缘计算实践)
  • 保姆级教程:在ArmSoM-W3开发板上用MPP解码视频(Debian11环境)
  • 惠州深圳东莞端午节粽子五芳斋粽子服务商代理商经销商信息汇总 - 速递信息
  • 英文降AI全攻略:如何将Turnitin检测率从86%(附实操技巧) - 殷念写论文
  • 2026年电力资质办理公司推荐榜:一级/二级/三级电力资质办理、升级、变更服务优质之选 - 速递信息
  • QMC音频解密终极指南:快速解锁加密音乐实现跨平台播放
  • Discuz论坛的黄金时代:那些年我们共同刷过的“灌水区” - 年度推荐企业名录
  • 解锁Godot游戏资源:Python解包工具深度解析与应用实战
  • 【题解】P8984 [北大集训 2021] 末日魔法少女计划
  • 戴尔笔记本风扇终极管理指南:免费开源智能散热解决方案
  • # 20254102 2025-2026-2 《Python程序设计》实验3报告