漫谈 JVM —— 内存模型、线程、锁
Java 内存模型(JMM),实际上的目的就是为了统一内存管理。这让我想到了,作为一个程序员总是想着有银弹,有一个代码能万能的在所有场景上。经过多次尝试我发现这是不可能的:需求在变,技术在更新,没有什么事万能的。
volatile 关键字保证了可见性、有序性,不能保证原子性,这是一个遗憾。是个事物总是有一些不圆满的。
Java 的线程还是和操作系统挂钩,所以,编程人员,还是要会底层,才能走的更远。
说道锁,JDK 1.6 对于锁的优化还是让人大开眼界。自旋锁、轻量级锁、偏向锁,为了解决重量级锁的性能问题而发明出来的锁,一个比一个厉害。自旋锁解决了上下文切换频繁的问题;轻量级锁解决了加锁性能太低的问题;偏向锁更是在轻量级锁进一步优化。然而别忘了我说的,没有银弹,没有银弹,没有银弹。现实生活中,大多数应用可能没有那么多共享变量,所以这三个锁,性能很好;但是,也有很多应用有很多共享变量,比如秒杀活动。这个时候用这三个锁就很头贴,冲突太多,偏向锁要膨胀到轻量级锁,轻量级锁要膨胀到重量级锁,性能急剧下降,膨胀的时候还有 STW 出现,在秒杀活动中这是十分可怕的。
就说这么多,学了这些内容,发现 JVM 的理念和唯物主义很像,一切从实际出发。