1 Java内存模型 JMM内存模型 ? Java内存模型(Java Memory Model简称JMM)是一种抽象的概念,并不真实存在,它描 述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构 成数组对象的元素)的访问方式。JVM运行程序的实体是线程,而每个线程创建 ...
分类:
编程语言 时间:
2020-05-01 18:29:43
阅读次数:
74
对于一个Java程序员而言,能否熟练掌握并发编程是判断他优秀与否的重要标准之一。因为并发编程是Java语言中最为晦涩的知识点,它涉及操作系统、内存、CPU、编程语言等多方面的基础能力,更为考验一个程序员的内功。那到底应该怎么学习并发编程呢?JavaSDK的并发工具包有很多,是要死记硬背每-一个工具的优缺点和使用场景吗?当然不是,想要学好并发编程,你需要从一个个单一的知识和技术中“跳出来”,高屋建瓴
分类:
编程语言 时间:
2020-04-28 16:42:08
阅读次数:
63
什么是单例模式 单例模式指的是,保证一个类只有一个实例,并且提供一个可以全局访问的入口。 为什么需要使用单例模式 那么我们为什么需要单例呢?其中一个理由,那就是为了节省内存、节省计算。因为在很多情况下,我们只需要一个实例就够了,如果出现更多的实例,反而纯属浪费。 下面我们举一个例子来说明这个情况,以 ...
分类:
其他好文 时间:
2020-04-25 19:02:18
阅读次数:
68
浅谈volatile 这篇文章我们主要了解一下几个问题 volatile的特性与指令重排序 DCL单例 volatile的实现,内存屏障 volatile的特性和指令重排序 首先volatile拥有可见性,这里就不过多解释了 然后另外一点是它能解决指令重排序。 那么问题来了什么是指令冲排序? 通俗的 ...
分类:
其他好文 时间:
2020-04-09 12:59:59
阅读次数:
87
一、volite的作用?如何保证内存可见性?如何防止指令重排? volatile关键字通过提供“内存屏障”的方式来防止指令被重排序,为了实现volatile的内存语义,编译器在生成字节码时,会在指令序列中插入内存屏障来禁止特定类型的处理器重排序。 二、volatile和synchronized区别1 ...
分类:
其他好文 时间:
2020-04-02 22:15:10
阅读次数:
56
由指令重排序引起的可见性问题: public class Test { // 如果运行时加上 -server 下面的代码就变成了死循环,没有加就正常运行。(运行器的编译优化只有在服务器模式下才执行) // 通过设置JVM参数,打印出JIT(即时编译)编译的内容(这里说的编译不是指class文件的编译 ...
分类:
编程语言 时间:
2020-03-30 21:19:54
阅读次数:
77
内存 共享主存和高速缓存(工作内存)。CPU高速缓存(L1,2)产生原因读写主存没有CPU执行指令快,他是某个CPU独有,只与该CPU运行的线程有关。 内存可见性 简单的说,CPU对数据的修改,对其他CPU立刻可见。下面我们详细地说。 CPU修改数据,首先对工作内存修改,再同步主内存。单线程中,变量 ...
分类:
编程语言 时间:
2020-03-28 16:29:56
阅读次数:
158
原博客:https://www.infoq.cn/article/java-memory-model-2/ 什么是指令重排序? java中的指令重排序是: 重排序通常是编译器或运行时环境为了优化程序性能而采取的对指令进行重新排序执行的一种手段。 重排序分为两类:编译期重排序和运行期重排序,分别对应编 ...
分类:
编程语言 时间:
2020-03-27 21:46:45
阅读次数:
93
指令重排的分类:编译期重排序和运行时重排序 在JVM编译时期或者CPU执行JVM字节码时期,对现有的指令进行重排序,主要目的为了优化运行速度(在不改变程序运行结果的前提下) int a = 3 //1 int b = 5; //2 int c = a + b; //3 虽然说指令重排可以调高程序的执 ...
分类:
编程语言 时间:
2020-03-27 13:14:41
阅读次数:
91
1.原子性:保证同一时刻该资源只能有一个线程访问修改,其他线程阻塞等待,例如Atomic包,锁 2.可见性:一个线程对于主内存的数据操作对于其他线程是可见的 3.有序性:一个线程观察其他线程中指令执行顺序,由于指令重排序存在,观察结果一般杂乱无序 原子性: 互斥访问,Atomic包,CAS算法,Sy ...
分类:
编程语言 时间:
2020-03-26 13:45:05
阅读次数:
91