众所周知,JVM 创建一个对象分三步: 1.在堆内存开辟内存空间。 2.在堆内存中实例化Car里面的各个参数。 3.把对象指向堆内存空间。 为了提高运行效率,编译器在编译代码时可能会对指令进行重排序。重排序的原则是,保证单线程执行结果的正确性,并遵循 happen-before 原则。 指令间的依赖 ...
分类:
编程语言 时间:
2020-06-05 00:25:38
阅读次数:
72
参考:https://mp.weixin.qq.com/s/DZkGRTan2qSzJoDAx7QJag 建议阅读:《深入理解Java虚拟机》相关章节 多线程下的 原子性 可见性 指令重排序 无法保证(单线程 可以保证) static int mainMemoryVariable=0; 线程1: m ...
分类:
编程语言 时间:
2020-05-21 21:06:23
阅读次数:
50
用户态和内核态 cas compare and swapcompare and exchangeCAS(比较并交换)是CPU指令级的操作,只有一步原子操作,所以非常快。而且CAS避免了请求操作系统来裁定锁的问题,不用麻烦操作系统,直接在CPU内部就搞定了。 重量级锁(创建锁需要惊动操作系统————0 ...
分类:
其他好文 时间:
2020-05-18 00:53:16
阅读次数:
99
java最新面试题及答案2020 面试题汇总之 并发锁 并发,锁 1.volatile关键字, Lock 并发编程中:原子性问题,可见性问题,有序性问题。 volatile关键字能保证可见性,字能禁止指令重排序,但是不能保证原子性。可见性只能保证每次读取的是最新的值,但是volatile没办法保证对 ...
分类:
编程语言 时间:
2020-05-17 21:58:38
阅读次数:
153
内存分配的两种方式 指针碰撞法 维护一个指针,指针左边为已分配的内存,右边为空闲内存,动态调整指针。在右边进行分配。 要求内存规整。 空闲表法 维护一张表,记录哪里分配了哪里没有分配。分配的时候找能存放对象的空间分配即可。 要求内存不规整。 内存分配并发问题(补充内容,需要掌握 在创建对象的时候有一 ...
分类:
其他好文 时间:
2020-05-17 17:31:35
阅读次数:
69
所谓并发编程,所谓有其三 一、高速缓存的两面性 cpu->高速缓存->内存 高速缓存:平衡cpu和内存之间的速度差异,变量从内存首先加载到高速缓存然后以供cpu计算使用。 对于同一个cpu来说,存储于其高速缓存中的变量,对于使用其时间碎片的线程来说,都是原子可见的,任何的变更都能及时的感知到其所被使 ...
分类:
编程语言 时间:
2020-05-14 22:40:48
阅读次数:
94
作者:iuxiaopeng https://www.cnblogs.com/paddix/p/5367116.html Synchronized 的基本使用 Synchronized 的作用主要有三个: 确保线程互斥的访问同步代码 保证共享变量的修改能够及时可见 有效解决重排序问题 从语法上讲,Sy ...
分类:
其他好文 时间:
2020-05-07 20:18:50
阅读次数:
62
一,.volatile关键字的两层语义: (一),一旦一个共享变量被volatile修饰之后,那么就具备了两层语义: 1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。 2)禁止进行指令重排序。 (二),内存屏障有两个能力: 1. 阻止屏 ...
分类:
其他好文 时间:
2020-05-05 20:03:37
阅读次数:
54
题要求编写程序,将给定字符串去掉重复的字符后,按照字符ASCII码顺序从小到大排序后输出。 输入格式: 输入是一个以回车结束的非空字符串(少于80个字符)。 输出格式: 输出去重排序后的结果字符串。 输入样例: ad2f3adjfeainzzzv 输出样例: 23adefijnvz #include ...
分类:
其他好文 时间:
2020-05-03 14:33:15
阅读次数:
165