Java内存知识整理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java内存知识整理相关的知识,希望对你有一定的参考价值。
因主要是摘录,先列参考文献:
http://ifeve.com/jmm-faq/
1,我理解的Java内存模型是在多处理器,多线程的场景下保证在内存里的读写不会存在歧义。
“Java内存模型描述了在多线程代码中哪些行为是合法的,以及线程如何通过内存进行交互。它描述了“程序中的变量“ 和 ”从内存或者寄存器获取或存储它们的底层细节”之间的关系。Java内存模型通过使用各种各样的硬件和编译器的优化来正确实现以上事情。”
2,同步,同步并不仅仅是互斥。
“同步保证了一个线程在同步块之前或者在同步块中的一个内存写入操作以可预知的方式对其他有相同监视器的线程可见”
“监视器有使本地处理器缓存失效的功能,因此变量会从主存重新加载,于是其它线程对共享变量的修改对当前线程来说就变得可见了”
3,volatile,写入volatile后会刷新缓存区,将volatile属性的值写入主存中。volatile和它周围非volatile的变量都不能够重排序
“当线程A写入一个volatile字段f的时候,如果线程B读取f的话 ,那么对线程A可见的任何东西都变得对线程B可见了。”
------------------
8.12
今天学会了好一点的单例写法,再也不用double-check了。
附double-check代码(摘自:http://blog.csdn.net/ritterliu/article/details/49744397)
instance 一定要加volatile关键字,用来去除掉处理器的一些优化,但是这代码真长啊,还是用更简洁的吧
class LazySingleton { private volatile static LazySingleton instance = null; private LazySingleton() { } public static LazySingleton getInstance() { //第一重判断 if (instance == null) { //锁定代码块 synchronized (LazySingleton.class) { //第二重判断 if (instance == null) { instance = new LazySingleton(); //创建单例实例 } } } return instance; } }
又想懒汉模式,又想不用同步。IoDH Initialization on Demand Holder
1 /** 2 * Created by jerry on 17-8-9. 3 */ 4 public class TestMain { 5 public static void main(String args[]) { 6 TestMain a = TestMain.getInstance(); 7 TestMain b = TestMain.getInstance(); 8 if (a == b) { 9 System.out.println(true); 10 } 11 12 } 13 14 private static class SingletonInstance { 15 private static final TestMain instance = new TestMain(); 16 } 17 18 public static TestMain getInstance() { 19 return SingletonInstance.instance; 20 } 21 }
完美╮(╯▽╰)╭
以上是关于Java内存知识整理的主要内容,如果未能解决你的问题,请参考以下文章
java内存流:java.io.ByteArrayInputStreamjava.io.ByteArrayOutputStreamjava.io.CharArrayReaderjava.io(代码片段