【不要再背】volatile的可见性和原子性

【不要再背】volatile的可见性和原子性

volatile作用

  • 保证内存可见性
  • 防止指令重排序
  • 注意:并不保证原子性

内存可见性

volatile保证可见性的原理是在每次访问变量时候都会进行一次刷新,因此每次访问都是准没存中最新的版本,所以volatile关键字的作用之一就是保证变量修改的实时可见性。

使用volatile使用必须的条件

  1. 对变量的写入操作不依赖变量的当前值,或者你能确保只有单个线程更新变量的值
  2. 该变量没有包含在具有其他变量的不变式中

volatile使用建议

  • 在两个或者更多的线程需要访问的成员变量上使用volatile,当腰访问的变量已在shnchronized代码块中或者常量时,咱们就没要使用volatile
  • 由于使用volatile屏蔽调JVM中必要的代码优化,所以在效率上比较低,因此一定在必要时才使用此关键字

volatile VS synchronized

  1. volatile不会进行枷锁操作,volatile变量是一种微弱的同步机制在访问volatile变量时不会执行解锁操作,因此不会执行线程阻塞,因此volatile变量是一种比synchronized关键字更轻量级的同步机制。
  2. volatile变量作用类似于同步变量读写操作,从内存可见性的角度来看,写入volatile变量相当于退出同步代码块,而读取volatile比那辆相当于进入同步代码块。
  3. volatile不如synchronized安全,在代码中如果过度使用volatile变量来控制状态的可见性,通常会比使用锁的代码更脆弱,也更难以理解,仅当volatile变量能简化代码的实现以及对同步策略的验证时,才应该使用volatile,一般来说,使用同步机制会更安。
  4. volatile无法同事保证内存可见性和原子性,加锁机制(同步机制)既可以确保可见性又可以确保原子性,而volatile只能保证可见性,原因是声明为volatile的简单变量如果昂墙纸与该变量以前的值相关,那么volatile关键字不起作用,也就是说下面的表达式都不是院子操作的:count++,i++。

可见性demo证明

www.zeeklog.com  - 【不要再背】volatile的可见性和原子性

不保证原子性demo证明

www.zeeklog.com  - 【不要再背】volatile的可见性和原子性

输出结果多变:

第一种结果

www.zeeklog.com  - 【不要再背】volatile的可见性和原子性

第二种结果

www.zeeklog.com  - 【不要再背】volatile的可见性和原子性

第三种

www.zeeklog.com  - 【不要再背】volatile的可见性和原子性

第四种

www.zeeklog.com  - 【不要再背】volatile的可见性和原子性

Read more

印度统治阶级锁死底层人的5大阳谋

印度统治阶级锁死底层人的5大阳谋

基于社会学和心理学视角: 1. 情感道德: 统治阶级通过塑造道德规范和情感价值观,引导底层人群的行为。例如,宣扬“勤劳致富”“忍耐美德”等观念,让底层人接受现状并自我约束。这种道德框架往往掩盖结构性不平等,使人们将个人困境归咎于自身而非系统。 2. 欲望控制: 通过消费主义和媒体宣传,统治阶级刺激底层人的物质与社会欲望(如名牌、地位),但同时设置经济壁垒,使这些欲望难以实现。底层人被困在追求“更好生活”的循环中,精力被分散,无法聚焦于挑战权力结构。 3. 情绪煽动: 利用恐惧、愤怒或民族主义等情绪,统治阶级可以通过媒体或公共事件转移底层人对社会问题的注意力。例如,制造外部敌人或内部对立(如阶层、种族矛盾),让底层人内耗而非联合反抗。 4. 暴利诱惑: 通过展示少数“成功案例”或快速致富的机会(如赌博、投机),诱导底层人追逐短期暴利。这种机制不仅让底层人陷入经济风险,还强化了对现有经济体系的依赖,削弱长期变革的可能性。 5. 权力震撼: 通过展示统治阶级的权力(

By Ne0inhk