博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
复习笔记02
阅读量:4596 次
发布时间:2019-06-09

本文共 736 字,大约阅读时间需要 2 分钟。

1. java ConcurrentModificationException异常原因和解决方法:

   1. 单线程:iterator.remove();

   2. 多线程情况下:iterator.remove() 处理同一个list,也会出问题

2. Java内存模型规定所有的变量都是存在主存当中(类似于前面说的物理内存),每个线程都有自己的工作内存(类似于前面的高速缓存)。线程对变量的所有操作都必须在工作内存中进行,而不能直接对主存进行操作。并且每个线程不能访问其他线程的工作内存。

3. 用volatile修饰之后就变得不一样了:

  第一:使用volatile关键字会强制将修改的值立即写入主存;

  第二:使用volatile关键字的话,当线程2进行修改时,会导致线程1的工作内存中缓存变量stop的缓存行无效(反映到硬件层的话,就是CPU的L1或者L2缓存中对应的缓存行无效);

  第三:由于线程1的工作内存中缓存变量stop的缓存行无效,所以线程1再次读取变量stop的值时会去主存读取。

  那么在线程2修改stop值时(当然这里包括2个操作,修改线程2工作内存中的值,然后将修改后的值写入内存),会使得线程1的工作内存中缓存变量stop的缓存行无效,然后线程1读取时,发现自己的缓存行无效,它会等待缓存行对应的主存地址被更新之后,然后去对应的主存读取最新的值。

  那么线程1读取到的就是最新的正确的值。

4. 通常来说,使用volatile必须具备以下2个条件:

  1)对变量的写操作不依赖于当前值

  2)该变量没有包含在具有其他变量的不变式中

转载于:https://www.cnblogs.com/Jtianlin/p/10397147.html

你可能感兴趣的文章
qt 中文乱码 处理QByteArray类型里含中文的数据
查看>>
跨库事务一致性问题的解决方式(例)
查看>>
ios build时,Undefined symbols for architecture xxx问题的总结
查看>>
20140704,七月微软安全补丁的通知
查看>>
JavaScript对象
查看>>
南理第八届校赛同步赛-C count_prime//容斥原理
查看>>
html 标签学习(续)
查看>>
iOS的规范问题
查看>>
Segments CodeForces 909B (找规律)
查看>>
【转】Castle开发系列文章
查看>>
WPF集合控件实现分隔符(ItemsControl Separator)
查看>>
手机连不上电脑的解决方案
查看>>
Oracle获取当前时间
查看>>
Tomcat,Jboss,Weblogic区别与比较
查看>>
CentOS7.4下使用Nginx配置Asp.net Core和添加Https证书步骤
查看>>
常用模块介绍
查看>>
一台云服务器怎么同时响应多个域名?
查看>>
【黑客免杀攻防】读书笔记1 - 初级免杀基础理论(反病毒软件特征码提取介绍、免杀原理、壳)...
查看>>
Java 枚举类
查看>>
noip模拟赛 PA
查看>>