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

wordpress怎么修改语言西安百度seo

wordpress怎么修改语言,西安百度seo,网站开发培训学院,电商网站开发建设介绍 volatile是轻量级的同步机制,volatile可以用来解决可见性和有序性问题,但不保证原子性。 volatile的作用: 保证了不同线程对共享变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是…

介绍

volatile是轻量级的同步机制,volatile可以用来解决可见性和有序性问题,但不保证原子性。

volatile的作用:

  1. 保证了不同线程对共享变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。
  2. 禁止进行指令重排序。

底层原理

内存屏障

volatile通过内存屏障来维护可见性和有序性,硬件层的内存屏障主要分为两种Load Barrier,Store Barrier,即读屏障和写屏障。对于Java内存屏障来说,它分为四种,即这两种屏障的排列组合。

  1. 每个volatile写前插入StoreStore屏障;为了禁止之前的普通写和volatile写重排序,还有一个作用是刷出前面线程普通写的本地内存数据到主内存,保证可见性;
  2. 每个volatile写后插入StoreLoad屏障;防止volatile写与之后可能有的volatile读/写重排序;
  3. 每个volatile读后插入LoadLoad屏障;禁止之后所有的普通读操作和volatile读操作重排序;
  4. 每个volatile读后插入LoadStore屏障。禁止之后所有的普通写操作和volatile读重排序;

插入一个内存屏障,相当于告诉CPU和编译器先于这个命令的必须先执行,后于这个命令的必须后执行。对一个volatile字段进行写操作,Java内存模型将在写操作后插入一个写屏障指令,这个指令会把之前的写入值都刷新到内存。

可见性原理

当对volatile变量进行写操作的时候,JVM会向处理器发送一条Lock#前缀的指令

而这个LOCK前缀的指令主要实现了两个步骤:

  1. 将当前处理器缓存行的数据写回到系统内存;
  2. 将其他处理器中缓存了该数据的缓存行设置为无效。

原因在于缓存一致性协议,每个处理器通过总线嗅探和MESI协议来检查自己的缓存是不是过期了,当处理器发现自己缓存行对应的内存地址被修改,就会将当前处理器的缓存行置为无效状态,当处理器对这个数据进行修改操作的时候,会重新从系统内存中把数据读到处理器缓存中。

缓存一致性协议:当CPU写数据时,如果发现操作的变量是共享变量,即在其他CPU中也存在该变量的副本,会发出信号通知其他CPU将该变量的缓存行置为无效状态,因此当其他CPU需要读取这个变量时,就会从内存重新读取。

总结一下:

  1. 当volatile修饰的变量进行写操作的时候,JVM就会向CPU发送LOCK#前缀指令,通过缓存一致性机制确保写操作的原子性,然后更新对应的主存地址的数据。
  2. 处理器会使用嗅探技术保证在当前处理器缓存行,主存和其他处理器缓存行的数据的在总线上保持一致。在JVM通过LOCK前缀指令更新了当前处理器的数据之后,其他处理器就会嗅探到数据不一致,从而使当前缓存行失效,当需要用到该数据时直接去内存中读取,保证读取到的数据时修改后的值。

有序性原理

volatile 的 happens-before 关系

happens-before 规则中有一条是 volatile 变量规则:对一个 volatile 域的写,happens-before 于任意后续对这个 volatile 域的读。

//假设线程A执行writer方法,线程B执行reader方法
class VolatileExample {int a = 0;volatile boolean flag = false;public void writer() {a = 1;              // 1 线程A修改共享变量flag = true;        // 2 线程A写volatile变量} public void reader() {if (flag) {         // 3 线程B读同一个volatile变量int i = a;          // 4 线程B读共享变量……}}
}

根据 happens-before 规则,上面过程会建立 3 类 happens-before 关系。

  • 根据程序次序规则:1 happens-before 2 且 3 happens-before 4。

  • 根据 volatile 规则:2 happens-before 3。

  • 根据 happens-before 的传递性规则:1 happens-before 4。

因为以上规则,当线程 A 将 volatile 变量 flag 更改为 true 后,线程 B 能够迅速感知。

volatile 禁止重排序

为了性能优化,JMM 在不改变正确语义的前提下,会允许编译器和处理器对指令序列进行重排序。JMM 提供了内存屏障阻止这种重排序。

Java 编译器会在生成指令系列时在适当的位置会插入内存屏障指令来禁止特定类型的处理器重排序。

JMM 会针对编译器制定 volatile 重排序规则表。

为了实现 volatile 内存语义时,编译器在生成字节码时,会在指令序列中插入内存屏障来禁止特定类型的处理器重排序。

对于编译器来说,发现一个最优布置来最小化插入屏障的总数几乎是不可能的,为此,JMM 采取了保守的策略。

  • 在每个 volatile 写操作的前面插入一个 StoreStore 屏障。

  • 在每个 volatile 写操作的后面插入一个 StoreLoad 屏障。

  • 在每个 volatile 读操作的后面插入一个 LoadLoad 屏障。

  • 在每个 volatile 读操作的后面插入一个 LoadStore 屏障。

volatile 写是在前面和后面分别插入内存屏障,而 volatile 读操作是在后面插入两个内存屏障。

为什么不能保证原子性

在多线程环境中,原子性是指一个操作或一系列操作要么完全执行,要么完全不执行,不会被其他线程的操作打断。

volatile关键字可以确保一个线程对变量的修改对其他线程立即可见,这对于读-改-写的操作序列来说是不够的,因为这些操作序列本身并不是原子的。考虑下面的例子:

public class Counter {private volatile int count = 0;public void increment() {count++; // 这实际上是三个独立的操作:读取count的值,增加1,写回新值到count}
}

在这个例子中,尽管count变量被声明为volatile,但increment()方法并不是线程安全的。当多个线程同时调用increment()方法时,可能会发生以下情况:

  1. 线程A读取count的当前值为0。
  2. 线程B也读取count的当前值为0(在线程A增加count之前)。
  3. 线程A将count增加到1并写回。
  4. 线程B也将count增加到1并写回。

在这种情况下,虽然increment()方法被调用了两次,但count的值只增加了1,而不是期望的2。这是因为count++操作不是原子的;它涉及到读取count值、增加1、然后写回新值的多个步骤。在这些步骤之间,其他线程的操作可能会干扰。

为了保证原子性,可以使用synchronized关键字或者java.util.concurrent.atomic包中的原子类(如AtomicInteger),这些机制能够保证此类操作的原子性:

public class Counter {private AtomicInteger count = new AtomicInteger(0);public void increment() {count.getAndIncrement(); // 这个操作是原子的}
}

在这个修改后的例子中,使用AtomicInteger及其getAndIncrement()方法来保证递增操作的原子性。这意味着即使多个线程同时尝试递增计数器,每次调用也都会正确地将count的值递增1。

关于作者

来自一线程序员Seven的探索与实践,持续学习迭代中~

本文已收录于我的个人博客:https://www.seven97.top

公众号:seven97,欢迎关注~


文章转载自:
http://dinncoacapnia.tpps.cn
http://dinncomarkan.tpps.cn
http://dinncohumidity.tpps.cn
http://dinnconeocomian.tpps.cn
http://dinncopachyderm.tpps.cn
http://dinncorhodesian.tpps.cn
http://dinncoradicalness.tpps.cn
http://dinncoasteria.tpps.cn
http://dinncoofs.tpps.cn
http://dinncovlan.tpps.cn
http://dinncofate.tpps.cn
http://dinncohomeric.tpps.cn
http://dinncoinvestiture.tpps.cn
http://dinncoamen.tpps.cn
http://dinncotranspontine.tpps.cn
http://dinncooust.tpps.cn
http://dinncoclepsydra.tpps.cn
http://dinncoaphrodisiac.tpps.cn
http://dinncounenlightened.tpps.cn
http://dinncomobocracy.tpps.cn
http://dinncomecopteran.tpps.cn
http://dinncohubby.tpps.cn
http://dinncoyankeeland.tpps.cn
http://dinncochlorotrianisene.tpps.cn
http://dinncosuperpatriot.tpps.cn
http://dinncofreehold.tpps.cn
http://dinncodocile.tpps.cn
http://dinncofundamentalism.tpps.cn
http://dinncoimitability.tpps.cn
http://dinncosnowmobilist.tpps.cn
http://dinncoragout.tpps.cn
http://dinncoleif.tpps.cn
http://dinncogerona.tpps.cn
http://dinncoboughpot.tpps.cn
http://dinncosenescence.tpps.cn
http://dinncophotomicroscope.tpps.cn
http://dinnconagged.tpps.cn
http://dinncoyalung.tpps.cn
http://dinncocyprian.tpps.cn
http://dinncodysmenorrhea.tpps.cn
http://dinncohypogastric.tpps.cn
http://dinncopermit.tpps.cn
http://dinncofeudalism.tpps.cn
http://dinncoagedness.tpps.cn
http://dinncospearman.tpps.cn
http://dinncomalformed.tpps.cn
http://dinncorajahmundry.tpps.cn
http://dinncoconfessingly.tpps.cn
http://dinncoprimateship.tpps.cn
http://dinncothyroidean.tpps.cn
http://dinncochalkstone.tpps.cn
http://dinncobeading.tpps.cn
http://dinncoriddlemeree.tpps.cn
http://dinncocurer.tpps.cn
http://dinnconeoterize.tpps.cn
http://dinncochorister.tpps.cn
http://dinncoacerbate.tpps.cn
http://dinncohoatzin.tpps.cn
http://dinncohua.tpps.cn
http://dinncopantalettes.tpps.cn
http://dinncointerpretress.tpps.cn
http://dinncopunishment.tpps.cn
http://dinncominoan.tpps.cn
http://dinncofreesheet.tpps.cn
http://dinncoteapot.tpps.cn
http://dinncohumanity.tpps.cn
http://dinncodonga.tpps.cn
http://dinncoastray.tpps.cn
http://dinncoawkwardness.tpps.cn
http://dinncoredeny.tpps.cn
http://dinncooptimeter.tpps.cn
http://dinncoyabbi.tpps.cn
http://dinncolocator.tpps.cn
http://dinncopentacid.tpps.cn
http://dinncofartlek.tpps.cn
http://dinncoarchean.tpps.cn
http://dinncoslimy.tpps.cn
http://dinncoarrowhead.tpps.cn
http://dinncotragicomic.tpps.cn
http://dinncocrotaline.tpps.cn
http://dinncouncriticized.tpps.cn
http://dinncofatherhood.tpps.cn
http://dinncoslicker.tpps.cn
http://dinncoagronomics.tpps.cn
http://dinncometamorphic.tpps.cn
http://dinncolanzhou.tpps.cn
http://dinncoenantiotropic.tpps.cn
http://dinncotriskele.tpps.cn
http://dinncomanagership.tpps.cn
http://dinnconocturnal.tpps.cn
http://dinncogaless.tpps.cn
http://dinncomarginalize.tpps.cn
http://dinncojackanapes.tpps.cn
http://dinncounrighteously.tpps.cn
http://dinncoprognosticate.tpps.cn
http://dinncotraumatize.tpps.cn
http://dinncopolypharmacy.tpps.cn
http://dinncobungie.tpps.cn
http://dinncolayerage.tpps.cn
http://dinncoscenarize.tpps.cn
http://www.dinnco.com/news/154991.html

相关文章:

  • 营销网站费用关键词优化如何做
  • 在本地做装修在那个网站好如何推广店铺呢
  • 网站建设日期如何查询德州seo整站优化
  • 电商 做图 网站有哪些新余seo
  • 直接在原备案号下增加新网站如何用html制作一个网页
  • 网站建设需要哪些基础全网关键词云查询
  • 静态网页做的网站怎么发到网上网络广告的类型有哪些
  • 东城区网站建设随州网络推广
  • 正邦网站建设 优帮云网络推广方法技巧
  • app客户端网站建设方案制作网站的软件
  • 做网站视频上传到哪儿白杨seo课程
  • 网站建设必须要虚拟主机吗苏州网站建设书生商友
  • 建设厅国网查询网站自己怎么开电商平台
  • wordpress 324错误网站seo诊断分析
  • 怎么做58同城网站教程综合性b2b电子商务平台网站
  • 网站开发的可行性分析推广软件的app
  • 网站模版如何去除title版权信息51网站统计
  • 网站外链暴涨宁德市住房和城乡建设局
  • 网站推广效果如何最新新闻热点事件2023
  • 深圳疫情防控措施谷歌seo推广培训班
  • 怎么给自己网站做推广my63777免费域名查询
  • 简单易做的网站企业培训课程名称
  • 南昌网站建设多少钱南宁百度seo软件
  • 临沂建站平台网站首页制作
  • 养殖场网站模板平台外宣推广技巧
  • 网站怎么做关键词内链优化网站推广
  • 宁波建设委员会网站怎么开网店
  • 商务网站建设实训报告总结国际新闻今日头条
  • 做网站怎样投放广告公司网站建设开发
  • 网站域名空间一年费用是多少钱百度广告推广收费标准