Ryan's Blog

Volatile是如何保证可见性和有序性的?

volatile是如何保证可见性和有序性的? 典型回答 volatile和可见性 对于volatile变量,当对volatile变量进行写操作的时候,JVM会向处理器发送一条lock前缀的指令,将这个缓存中的变量回写到系统主存中。 所以,如果一个变量被volatile所修饰的话,在每次数据变化之后,其值都会被强制刷入主存。而其他处理器的缓存由于遵守了缓存一致性协议,也会把这个变量的值从...

Synchronized的锁能降级吗?

synchronized 的锁能降级吗? 典型回答 synchronized的锁升级过程是怎样的? 我们知道,synchronized 是有锁升级的过程的,会从偏向锁升级到轻量级锁和重量级锁,那么synchronized的锁有降级的过程吗?(这个问题,网上也有很多文章,五花八门。。。) 大家理解的锁降级,如果是指锁从重量级状态回退到轻量级或偏向锁状态的过程,那么可以明确的说,当前的H...

Synchronized的锁升级过程是怎样的?

synchronized的锁升级过程是怎样的? 典型回答 在JDK 1.6及之前的版本中,synchronized锁是通过对象内部的一个叫做监视器锁(也称对象锁)来实现的。当一个线程请求对象锁时,如果该对象没有被锁住,线程就会获取锁并继续执行。如果该对象已经被锁住,线程就会进入阻塞状态,直到锁被释放。这种锁的实现方式称为“重量级锁”,因为获取锁和释放锁都需要在操作系统层面上进行线程的阻塞...

Synchronized的锁优化是怎样的?

synchronized的锁优化是怎样的? 典型回答 高效并发是从JDK 1.5 到 JDK 1.6的一个重要改进,HotSpot虚拟机开发团队在这个版本中花费了很大的精力去对Java中的锁进行优化,如适应性自旋、锁消除、锁粗化、轻量级锁和偏向锁等。这些技术都是为了在线程之间更高效的共享数据,以及解决竞争问题。 关于轻量级锁和偏向锁,还有适应性自旋参考: https://www.yu...

Synchronized是如何保证原子性、可见性、有序性的?

synchronized是如何保证原子性、可见性、有序性的? synchronized如何保证原子性 原子性是指一个操作是不可中断的。 并发编程中的原子性和数据库ACID的原子性一样吗? 我们知道,线程是CPU调度的基本单位。CPU有时间片的概念,会根据不同的调度算法进行线程调度。当一个线程获得时间片之后开始执行,在时间片耗尽之后,就会失去CPU使用权。所以在多线程场景下,由于时...