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

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 }

完美╮(╯▽╰)╭

转载于:https://www.cnblogs.com/mkcoding/p/7342490.html

相关文章:

  • 嵌入式GPIO接口及操作(一)
  • Redis源代码剖析--对象object
  • JavaScript 基本语法
  • 四轴遥控器ADC部分
  • 代码备忘, TODO宏实现
  • html2canvas页面截图图片不显示
  • 4.5 以卫语句取代嵌套条件式
  • 最近面试js部分试题总结
  • DP 网易内推:合唱团
  • Concatenated Words
  • 差异表达基因分析:差异倍数(fold change), 差异的显著性(P-value) | 火山图
  • js引用类型
  • windows多线程应用编程注意事项
  • python的md5和base64加密
  • 【Spring】DispatcherServlet源码分析
  • [LeetCode] Wiggle Sort
  • JavaScript-Array类型
  • JS基础之数据类型、对象、原型、原型链、继承
  • MaxCompute访问TableStore(OTS) 数据
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 成为一名优秀的Developer的书单
  • 飞驰在Mesos的涡轮引擎上
  • 开源地图数据可视化库——mapnik
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • 移动端高清、多屏适配方案
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (编译到47%失败)to be deleted
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (转载)(官方)UE4--图像编程----着色器开发
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • ... 是什么 ?... 有什么用处?
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .apk 成为历史!
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .考试倒计时43天!来提分啦!
  • /3GB和/USERVA开关
  • @AutoConfigurationPackage的使用
  • @EnableWebMvc介绍和使用详细demo
  • @WebService和@WebMethod注解的用法
  • @zabbix数据库历史与趋势数据占用优化(mysql存储查询)
  • @软考考生,这份软考高分攻略你须知道
  • [ vulhub漏洞复现篇 ] JBOSS AS 5.x/6.x反序列化远程代码执行漏洞CVE-2017-12149
  • [BZOJ] 2006: [NOI2010]超级钢琴
  • [C++打怪升级]--学习总目录
  • [CERC2017]Cumulative Code
  • [CISCN2019 华北赛区 Day1 Web5]CyberPunk --不会编程的崽
  • [LeetCode][面试算法]逻辑闭环的二分查找代码思路
  • [LeetCode]-使用特殊算法的题目-2
  • [Linux]Ubuntu noVNC使用