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

java并发

1.原子性 可见性 有序性

原子性:synchronized

可见性:volatile,synchronized,final

有序性:volatile,synchronized

2.volatile

特性

1.防止指令重排序

2.线程可见

经典使用场景

1.DCL单例模式

public class Singleton { private volatile static Singleton instance; public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } public static void main(String[] args) { Singleton.getInstance(); } }

主要应用了防止指令重排序,因为 new Singleton() 非原子操作。

jvm会将其分解为多个步骤:

  1. 分配内存空间;
  2. 调用构造函数初始化对象;
  3. instance引用指向该内存地址。

2.并发开关

volatile boolean shutdownRequested; public void shutdown() { shutdownRequested = true; } public void doWork() { while (!shutdownRequested) { //代码的业务逻辑 } }

使用了线程的可见性特性

3.反例

public class VolatileTest { public static volatile int race = 0; public static void increase() { race++; } private static final int THREADS_COUNT = 20; public static void main(String[] args) { Thread[] threads = new Thread[THREADS_COUNT]; for (int i = 0; i < THREADS_COUNT; i++) { threads[i] = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 10000; i++) { increase(); } } }); threads[i].start(); } // 等待所有累加线程都结束 while (Thread.activeCount() > 1) Thread.yield(); System.out.println(race); } }

因为race++不是原子操作,又没有加锁,所以并不安全

工作线程虽然读取了主内存的数据,但是由于++操作非原子,导致计算之后写回主线程的数据有误

3.synchronized

1.原子性

底层使用了节码指令monitorentermonitorexit,来实现lock,unlock

2.可见性

同步块的可见性是由“对一个变量执行unlock操作之前,必须先把此变量同步回主内存中(执行storewrite操作)”这条规则获得的

3.有序性

Java语言提供了volatilesynchronized两个关键字来保证线程之间操作的有序性,volatile关键字本 身就包含了禁止指令重排序的语义,而synchronized则是由一个变量在同一个时刻只允许一条线程对 其进行lock操作这条规则获得的,这个规则决定了持有同一个锁的两个同步块只能串行地进入。
http://www.jsqmd.com/news/497597/

相关文章:

  • 手持终端PDA怎么选?一篇讲清核心要点与实用推荐 - 企业推荐官【官方】
  • python-flask大学生家教管理系统
  • 关于@overload装饰器的几点理解
  • 运维转行网络安全:从优势切入,6-12个月实战转型指南
  • 一次生成、无限复用:易元 AI 双引擎重构生产逻辑,AI 混剪素材复用让内容越做越省
  • Autodesk Maya
  • 【AI Agent 学习笔记 task1】Day2:初识智能体
  • SpringBoot实现文件上传和下载
  • 上海小程序定制公司推荐:如何避开低价陷阱选对家
  • 2026农机橡塑配件推荐榜:排种器/排种盒/排种管/播种机塑料件/播种机尼龙件/播种机有机肥排肥装置/播种机有机肥施肥装置/选择指南 - 优质品牌商家
  • 大模型AI-入门-发展历程-机器学习
  • 上海新锐品牌Lifenias:用酸枣百合滴鸡精拯救睡眠 - 中媒介
  • 测试结果验证测试:无限递归的俄罗斯套娃
  • 链表_必会面试题2
  • 数据库安全最后一公里:金仓SQL防火墙如何填平开发留下的注入坑
  • 1391、STM32单片机智能语音识别分类垃圾桶 超声波检测溢满报警 语音播报垃圾分类(程序+原理图+PCB文件+proteus仿真+参考论文+开题报告+原理图文字讲解+程序流程图+硬件框图+器件清单
  • 「龙虾」来了!OpenClaw如何掀起AI智能体革命
  • 东华复试day17
  • 挺黑色幽默的笑话
  • python-flask导师选择分配管理系统 _0spy6
  • 基于LangChain的RAG与Agent智能体开发 - OpenAI库介绍和使用
  • 四川大学团队破解“万能图像修复“难题
  • AOP相关面试题
  • 提示系统SQL优化从慢到快:架构师用提示工程实现查询响应速度提升10倍
  • 英集芯IP2391N支持低功耗Boost充电的微光能量收集芯片
  • PCB抄板技术全流程解析
  • 如何在Dev-C++中设置临时环境变量?
  • 【码道初阶-Hot100】LeetCode 438 + 567 对照详解:一套滑动窗口模板,彻底讲透“固定长度窗口 + 计数数组 + count维护”
  • 基于「YOLO目标检测 + 多模态AI分析」的热轧钢带表面缺陷检测分析系统
  • 24大数据 R语言代码合集