Violate关键字

引用:https://www.cnblogs.com/dolphin0520/p/3920373.html
这篇博客讲的比较好。
个人理解:violate能够保证可见性和有序性,

可见性:

例子如下:

//线程1
boolean stop = false;
while(!stop){doSomething();
}//线程2
stop = true;

当线程1,stop为共享变量,放在主存中,线程1读取一份数据放到工作内存中,进行while循环,而线程二,运行时也读取了stop变量到工作内存中,但是单线程二赋值stop为true时,没发立即将stop的值写入到主存中,只会写入到工作内存。
当将stop用violate关键字修饰时,发生修改后,会产生3中效果。
1.将stop值,立即写入主存。
2.将线程1中工作内存的stop值缓存行,置为无效。
3.由于线程1读取stop值时,工作内存无效,会重新去主存读取。

顺序性:

例子如下:

//线程1:
context = loadContext();   //语句1
inited = true;             //语句2//线程2:
while(!inited ){sleep()
}
doSomethingwithconfig(context);

inited被violate修饰时,保证context已经初始化完毕,效果是:
1.当程序执行到volatile变量的读操作或者写操作时,在其前面的操作的更改肯定全部已经进行,且结果已经对后面的操作可见;在其后面的操作肯定还没有进行。
2. 在进行指令优化时,不能将在对volatile变量访问前的语句放在其后面执行,也不能把volatile变量后面的语句放到其前面执行。

violate没发保证原子性

public class Test {public volatile int inc = 0;public void increase() {inc++;}public static void main(String[] args) {final Test test = new Test();for(int i=0;i<10;i++){new Thread(){public void run() {for(int j=0;j<1000;j++)test.increase();};}.start();}while(Thread.activeCount()>1)  //保证前面的线程都执行完Thread.yield();System.out.println(test.inc);}
}

violate不能保证原子性,violate的使用场景是,

  1. 状态标记量
volatile boolean flag = false;while(!flag){doSomething();
}public void setFlag() {flag = true;
}
volatile boolean inited = false;
//线程1:
context = loadContext();
inited = true;            //线程2:
while(!inited ){sleep()
}
doSomethingwithconfig(context);
  1. 双重循环校验
class Singleton{private volatile static Singleton instance = null;private Singleton() {}public static Singleton getInstance() {if(instance==null) {synchronized (Singleton.class) {if(instance==null)instance = new Singleton();}}return instance;}
}

双重校验理解:
1.第一次判断(instance==null)是为了减少线程访问时都需要加锁后在判断,影响效率。所以在加锁前做了判断,如果获取锁后,继续判断是否初始化成功,如果没成功在初始化。
2.此时初始化,是分成3个部分,
a.开辟内存对象。
b.初始化对象。
c.将内存对象引用赋值给变量。
b和c可能会发生重排序,这时如果有线程走到第一次判断,则会拿到一个未初始化的对象,运行会发生错误。

violate关键字相关推荐

  1. violate关键字---java高并发

    内存模型相关概念 计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入.由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于C ...

  2. violate关键字的理解

    2019独角兽企业重金招聘Python工程师标准>>> 要理解violate关键字,首先你一定要先对jvm运行内存有了解,我们先来大致的了解一下jvm运行内存分区 jvm运行是的内存 ...

  3. Java中violate关键字详解(2)?真正了解violate

    一.Java内存模型 想要理解volatile为什么能确保可见性,就要先理解Java中的内存模型是什么样的. Java内存模型规定了所有的变量都存储在主内存中.每条线程中还有自己的工作内存,线程的工作 ...

  4. violate关键字的用法

    由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化.比如: static int i=0; int main(void) { ... while (1) { if (i) ...

  5. Java中violate关键字详解

    一.Java内存模型 想要理解volatile为什么能确保可见性,就要先理解Java中的内存模型是什么样的. Java内存模型规定了所有的变量都存储在主内存中.每条线程中还有自己的工作内存,线程的工作 ...

  6. 从violate到ConcurrentHashMap,我通过引导面试官,过了多场技术面试

    这应该是2,3年前的事情了,不过本文给出的技巧比较有通用型,一些Java开发经验在3年以内,甚至是5年以内的程序员,在面试时,都可以采用类似的技巧在面试中高效展示实力. 我们知道面试官喜欢问多线程问题 ...

  7. 快手Java一面,二面社招合并面经分享

    来自:程序员面试 作者:reed,一个热爱技术的斜杠青年,程序员面试联合创始人 快手java面经 1.要不先做下自我介绍?说一说你最近做的那个项目?然后针对简历提了几个问题.你哪年生的啊?我看你简历上 ...

  8. 拼多多java开发一面、二面合并面经

    作者:reed,一个热爱技术的斜杠青年,程序员面试联合创始人 一.项目方面 首先上来简单做一下自我介绍.然后让介绍简历里的项目.说下项目里的难点,技术架构.平时开发过程中都遇到过哪些难题? 平时都这么 ...

  9. 经验分享:java批量读取txt文件入库

    第一部分 项目+自我介绍 首先上来简单做一下自我介绍? 然后让介绍简历里的项目,说下项目里的难点,技术架构. 平时开发过程中都遇到过哪些难题? 平时都这么和同事沟通? 第二部分 java基础方面 首先 ...

最新文章

  1. hadoop中datanode无法启动,报Caused by: java.net.NoRouteToHostException: No route to host
  2. 前端ajax传递json格式参数,后端springboot接收
  3. ubtunu打开firefox_在Ubuntu中安装Mozilla Firefox的4种方法
  4. ajax error的报错提示
  5. ORACLE忘记用户名密码
  6. 优秀的穿越机玩家们看过来,你们现在拥有进入DRL2018赛季的机会了
  7. 译文伪原创的全文翻译软件
  8. 2021年电工(初级)考试试卷及电工(初级)考试平台
  9. 笔记本电脑频繁自动重启_电脑老是自动重启,电脑总是自动重启 - 电脑经常自动重启的解决办法 - 安全专题...
  10. 计算机系统内部存储器的存储单元,内部存储器练习
  11. 那个单位用计算机系统冷却,消防知识100题
  12. Tomcat的appBase和docBase解析
  13. 关于html中的图片居中问题
  14. HTML5 视频直播那些事儿+吕小鸣博客
  15. 魅族 刷机android 6.0,乐视X900+安卓6.0 魅族Flyme6刷机包 最新6.7.12.29R付费纯净版
  16. 极速office(Word)如何在表格里面插入行或者列
  17. 软件开发的管理和控制
  18. 技术博客|第15期:流媒体传输协议简介 - HLS协议
  19. 项目数据字典数据导入导出
  20. 斯坦福大学研究人员利用AI生成表情包

热门文章

  1. ajax里的append,使用AJAX源和appendTo理解和实现jQuery自动完成
  2. UVA 12325 Zombie's Treasure Chest
  3. C++使用CFile类文件读写
  4. mysql重复读导致余额不对_我所理解的MySQL之四:事务、隔离级别及MVCC
  5. 高级计算机应用a,A东师计算机应用基础15春在线作业.doc
  6. 【7.talker.py listener.py】转载自他人作品,相关专业知识咨询相关人员!
  7. 如何将ppt转换为jpg图片
  8. 【Linux共享内存】
  9. backtrack 5 虚拟机 安装
  10. 设计模式之禅——模板方法模式(Template Method Pattern)