随笔分类 - jvm相关
摘要:之前的时候看《并发编程的艺术》,书中提到dcl写法的单例模式是有问题的,有可能会导致调用者得到一个创建了一半的对象,从而导致报错。修复办法是将单例对象的引用添加volatile进行修饰,禁用重排序,则外界获取的就一定是已经创建好的对象了。 光说总是不行的,上代码: public class Sing
阅读全文
摘要:常说的单例有懒汉跟饿汉两种写法。饿汉由于类加载的时候就创建了对象,因此不存在并发拿到不同对象的问题,但会由于开始就加载了对象,可能会造成一些启动缓慢等性能问题;而懒汉虽然避免了这个问题,但普通的写法会在高并发环境下创建多个对象,单纯加synchronize又会明显降低并发效率,较好的两种写法是静态内
阅读全文
摘要:因自研的自动化测试工具包含压测功能,在自己本地代码开发完毕后进行测试,对目标接口进行1000次访问,发现idea在执行结束后变的异常卡顿,怀疑是idea工具或者程序代码存在问题,遂进行排查。 本地所用MacBook Pro 2015配置 处理器:i7 2.2GHz 核心数:4 内存:16GB 系统:
阅读全文
摘要:高效并发是jdk1.5到1.6的一个重要改进,hotspot虚拟机开发团队在这个版本上花费了大量精力去实现各种锁优化技术,例如:适应性自旋、锁消除、锁粗化、轻量级锁跟偏向锁等,这些技术都是为了在线程间更高效的共享数据,以解决竞争问题,从而提高程序执行效率。 自旋锁与自适应自旋: 虚拟机开发团队注意到
阅读全文
摘要:了解了什么是线程安全之后,接下来就是如何实现线程安全。那么了解虚拟机提供的同步机制以及锁机制也就非常重要了。 1、互斥同步 互斥同步是指多个线程并发访问共享数据时,保证共享数据在同一时刻只被一个线程使用。在这个地方,互斥是因,同步是果;同步的实现方式是通过互斥来实现的;常见的互斥实现方式有:临界区(
阅读全文
摘要:java内存模型是围绕着在并发过程中如何处理原子性,可见性跟有序性这三个问题来建立的。先看一下这三个特性: 1、原子性 由java内存模型来直接保证的原子性变量操作就是上文2中提到的8种基本操作,我们大致可以认为基本数据类型的读写是具备原子性的(long跟double不必太过在意)。如果需要一个更大
阅读全文
摘要:线程安全定义: 《Java Concurrency In Practice》(并发编程实践)中有一个相对恰当的定义:当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那么这
阅读全文
摘要:关于主内存与工作内存之间具体的交互协议,即一个变量如何从主内存拷贝到工作内存,如何从工作内存同步回主内存之类的实现细节,java内存模型中定义了8种操作来完成,虚拟机实现时必须保证这8种操作都是原子的、不可分割的(对于long和double类型的变量来说,load、store、read跟write在
阅读全文
摘要:要了解多线程,先需要把java线程模型搞清楚,否则有时候很难理清楚一个问题。 硬件多线程: 物理机硬件的并发问题跟jvm中的情况有不少相似之处,物理机的并发处理方案对于虚拟机也有相当大的参考意义。在买电脑或者自己diy的时候经常看到商家的介绍,什么“4核8线程”,“8核16线程”;这里“核”是指cp
阅读全文
摘要:本文纯粹为阅读深入理解jvm虚拟机手记文章。 我们知道,jvm分为5部分:程序计数器、虚拟机栈、本地方法栈、方法区、堆。其中,前三部分线程私有,这几个区域不太需要考虑回收问题,因为一般随着线程结束,内存自然就回收了;但方法区跟堆就不一样,需要根据情况具体分析其中对象的创建与回收问题。 如何判断对象已
阅读全文
摘要:JVM的内存区域划分: jvm的内存区域分为5部分:程序计数器,虚拟机栈,本地方法栈,堆跟方法区。 程序计数器,虚拟机栈,本地方法栈三部分是线程私有的,堆跟方法区是公共的。 1、程序计数器 是一块较小的内存区域,用于记录当前线程运行的位置,可以看做是程序所执行的字节码的行号指示器。如果正在执行的是一
阅读全文
浙公网安备 33010602011771号