可关注微信公众号“假装正经的程序员”与博主取得联系,回复“多线程”可获取详细答案
本篇为多线程基础内容,部分问题相对比较“刁钻”,却又是中高级开发工程师必须掌握的知识点,因此本篇内容需要全部熟知
问题
-
什么是volatile
-
volatile的实现原理
-
ConcurrentHashMap如何实现线程安全
-
ConcurrentHashMap为什么不允许插入NULL
-
Synchronized的底层实现原理是什么
-
Synchronized如何锁升级的
-
Synchronized可以锁降级么
-
什么是AQS
-
如何基于AQS实现公平锁
-
ReentrantLock可重入锁的实现原理
-
Synchronized和ReentrantLock有什么不同点
-
为什么公平锁比非公平锁慢
答案
-
什么是volatile
volatile 是一种关键字,用于保证多线程情况下共享变量的可见性。当一个变量被声明为 volatile 时,每个线程在访问该变量时都会立即刷新其本地内存(工作内存)中该变量的值,确保所有线程都能读到最新的值。并且使用 volatile 可以禁止指令重排序,这样就能有效的预防,因为指令优化(重排序)而导致的线程安全问题。 也就是说 volatile 有两个主要功能:保证内存可见性和禁止指令重排序。
-
volatile的实现原理
volatile 关键字在底层的实现主要是通过内存屏障(memory barrier)来实现的。内存屏障是一种 CPU 指令,用于强制执行 CPU 的内部缓存与主内存之间的数据同步。 在 Java 中,当线程读取一个 volatile 变量时,会从主内存中读取变量的最新值,并把它存储到线程的工作内存中。当线程写入一个 volatile 变量时,会把变量的值写入到线程的工作内存中,并强制将这个值刷新到主内存中。这样就保证了 volatile 变量的可见性和有序性。 在 Java 5 之后,volatile 的实现还引入了“内存屏障插入”的机制,内存屏障插入是指在指令序列中插入内存屏障以保证变量的可见性和有序性。
-
ConcurrentHashMap如何实现线程安全