摘要:
一、Java堆内存结构 JVM将堆分成了二个大区新生代(Young)和老年代(Old),新生代又被进一步划分为Eden(伊甸园空间)和Survivor(幸存者空间)区,而Survivor由Survivor1和Survivor2组成,也有些人喜欢用FromSpace和ToSpace来代替。这里为什么要 阅读全文
摘要:
concurrent包是基于AQS (AbstractQueuedSynchronizer)框架的,AQS框架借助于两个类: Unsafe(提供CAS操作) LockSupport(提供park/unpark操作,底层仍然调用是Unsafe类的park/unpark方法) 因此,LockSuppor 阅读全文
摘要:
前言 摘自《深入理解Java虚拟机》一书 互斥同步对性能最大的影响是阻塞的实现,挂起线程和恢复线程的操作都需要转入内核态中完成,这些操作给系统的并发性能带来了很大的压力。而在很多应用上,共享数据的锁定状态只会持续很短的一段时间。若实体机上有多个处理器,能让两个以上的线程同时并行执行,我们就可以让后面 阅读全文
摘要:
CAS(Compare And Swap) 比较并交换 前言 在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁。锁机制存在以下问题: 在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。 一个线程持有锁会导致其它所有需要此锁的线程挂起。 阅读全文
摘要:
一、synchronized 的原理 JVM 基于进入和推出Monitor对象来实现方法和同步代码块,但两者的实现细节不同。 synchronize 修饰的同步代码块:使用monitorenter 和 monitorexit 指令实现; synchronize 修饰的方法并没有 monitorent 阅读全文
摘要:
锁的状态总共有四种:无锁状态、偏向锁、轻量级锁和重量级锁。随着锁的竞争,锁可以从偏向锁升级到轻量级锁,再升级的重量级锁。JDK 1.6中默认是开启偏向锁和轻量级锁的,我们也可以通过-XX:-UseBiasedLocking来禁用偏向锁。锁的状态保存在对象的头文件中,以32位的JDK为例。 每个对象一 阅读全文