并发编程面试文章地址链接
内容 | 博客链接 |
---|---|
并发编程面试题之常见面试题 | https://blog.csdn.net/weixin_38251871/article/details/104658674 |
并发编程面试题之 volatile 关键字 |
https://blog.csdn.net/weixin_38251871/article/details/104667384 |
并发编程面试题之 CAS |
https://blog.csdn.net/weixin_38251871/article/details/104667406 |
并发编程面试题之锁 | https://blog.csdn.net/weixin_38251871/article/details/104667392 |
并发编程面试题之阻塞队列 | 待完成… |
并发编程面试题之 AQS |
待完成… |
并发编程面试题之线程池 | 待完成… |
并发编程面试题之 synchronized 和 ReentrantLock 的区别 |
https://blog.csdn.net/weixin_38251871/article/details/104667532 |
并发编程面试题之 CyclicBarrier、CountDownLatch、Semaphore |
待完成… |
并发编程面试题之 ConcurrentHashMap |
https://blog.csdn.net/weixin_38251871/article/details/104667433 |
并发编程面试题之 synchronized 实现原理 |
https://blog.csdn.net/weixin_38251871/article/details/104667415 |
变量可见性:
保证了该变量对所有的线程是可见的。【例:线程 one 修改了变量的值,那么其他线程都可以获取到最新值】
禁止指令重排序
-
Java 语言提供的一种稍弱的同步机制,
volatile
关键字 用于确保将变量的更新操作通知给其他的线程;volatile
具备两种特性,它不会被缓存在寄存器【CPU 缓存】,所以在读取 volatile 关键字修饰的变量时总是会从主内存中返回最新值。 -
对非
volatile
关键字修饰的变量进行读写操作的时候,每个线程先从主内存拷贝变量的值到 CPU cache 中,假如有多个 CPU,每个线程可能在不同的 CPU 上处理,这意味着每个线程可以拷贝到不同的 CPU 缓存。 -
使用
volatile
关键字修饰的变量,JVM
跳过了 CPU 缓存,保证了每次读写都是对主内存进行操作。 -
对
volatile
关键字修饰的变量的单次 read/write 操作是可以保证原子性的,比如long/double/boolean
类型的变量,因为long/double/boolean
都是 64 位,对于这两种数据类型的读是分为两个部分,第一次读取的是 32 位,然后再读取剩下的 32 位,在这个过程中不是原子操作。但JVM
中的volatile
关键字修饰的long/double/boolean
后, 其读写就是原子操作。但是对于 自增/自减 并不能保证原子性,因为它们本质上是读和写两次操作。