千家信息网

并发编程三要素是什么

发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,本篇内容主要讲解"并发编程三要素是什么",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"并发编程三要素是什么"吧!并发编程三要素**原子性:**一个不可再被分
千家信息网最后更新 2025年12月02日并发编程三要素是什么

本篇内容主要讲解"并发编程三要素是什么",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"并发编程三要素是什么"吧!

并发编程三要素
  1. **原子性:**一个不可再被分割的颗粒。原子性指的是一个或多个操作要么全部执行成功要么全部执行失败。

  2. 有序性: 程序执行的顺序按照代码的先后顺序执行。(处理器可能会对指令进行重排序)

  3. 可见性: 一个县城对共享变量的修改,另一个线程能够立刻看到。

一、原子性

线程切换会带来原子性的问题

int i = 1; // 原子操作i++; // 非原子操作,从主内存读取 i 到线程工作内存,进行 +1,再把 i 写到主内存。

虽然读取和写入都是原子操作,但合起来就不属于原子操作,我们又叫这种为"复合操作"。

我们可以用synchronized 或 Lock 来把这个复合操作"变成"原子操作。

例子:

//使用synchronizedprivate synchronized void increase(){   i++; }//使用Lockprivate int i = 0; Lock mLock = new ReentrantLock();  private void increase() {   mLock.lock();   try {     i++;   } finally{     mLock.unlock();   } }

这样我们就可以把这个一个方法看做一个整体,一个不可分割的整体。

除此之前,我们还可以用java.util.concurrent.atomic里的原子变量类,可以确保所有对计数器状态访问的操作都是原子的。

例子:

  AtomicInteger mAtomicInteger = new AtomicInteger(0);    private void increase(){    mAtomicInteger.incrementAndGet();  }
二、可见性

缓存导致可见性问题

int v = 0;// 线程 A 执行v++; // 线程 B 执行System.out.print("v=" + v);

即使是在执行完线程里的 i++ 后再执行线程 B,线程 B 的输入结果也会有 2 个种情况,一个是 0 和1。

因为 i++ 在线程 A(CPU-1)中做完了运算,并没有立刻更新到主内存当中,而线程B(CPU-2)就去主内存当中读取并打印,此时打印的就是 0。

禁用缓存能保证可见性,volatile关键字可以禁用缓存

synchronized和Lock能够保证可见性。

三、有序性

导致有序性的原因是编译优化

我们都知道处理器为了拥有更好的运算效率,会自动优化、排序执行我们写的代码,但会确保执行结果不变。

例子:

int a = 0; // 语句 1int b = 0; // 语句 2i++; // 语句 3b++; // 语句 4

这一段代码的执行顺序很有可能不是按上面的 1、2、3、4 来依次执行,因为 1 和 2 没有数据依赖,3 和 4 没有数据依赖, 2、1、4、3 这样来执行可以吗?完全没问题,处理器会自动帮我们排序。

在单线程看来并没有什么问题,但在多线程则很容易出现问题。

再来个例子:

// 线程 1init();inited = true; // 线程 2while(inited){    work();}

init(); 与 inited = true; 并没有数据的依赖,在单线程看来,如果把两句的代码调换好像也不会出现问题。

但此时处于一个多线程的环境,而处理器真的把这两句代码重新排序,那问题就出现了,若线程 1 先执行 inited = true; 此时,init() 并没有执行,线程 2 就已经开始调用 work() 方法,此时很可能造成一些奔溃或其他 BUG 的出现。

synchronized和Lock能确保原子性,能让多线程执行代码的时候依次按顺序执行,自然就具有有序性。

而volatile关键字也可以解决这个问题,volatile 关键字可以保证有序性,让处理器不会把这行代码进行优化排序。

到此,相信大家对"并发编程三要素是什么"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

线程 原子 问题 代码 有序 内存 处理器 有序性 处理 要素 编程 例子 语句 顺序 排序 关键 关键字 数据 方法 缓存 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 中职计算机网络技术检测试题 四川互联网软件开发报价 qt可接入的数据库 局域网更换ip后才能登录服务器 铁木真网络技术代运营怎么样 魔兽世界暗影国度部落服务器推荐 北仑财务软件开发公司电话 侣程网络技术有限公司 根据网络安全规定负责 职业杀手小说软件开发 网络安全法中的防范风险措施 数据库打印模板更改如何保存 网络安全培训师资格证书 华为服务器无法识别阵列卡 淮安企业网络安全准入控制 csgo重启服务器的指令 教学大纲数据库系统原理 辽宁微服务架构数据库 数据库安全的管理 数据库技术与应用开发教程 机房服务器常见问题及处理方法 同仁软件开发外包公司 腾讯云轻量应用服务器怎么分盘 表格填充数据库 安装包怎么传到服务器桌面 辽阳网络技术工程师证 tbc竞技场服务器排名 互联网科技公司年会主持词 政府网络安全宣传周活动总结 软件开发专项奖励申请报告
0