JUC高频面试题---由Volatile印出来的一系列问题

简介: JUC高频面试题---由Volatile印出来的一系列问题

一、Volatile关键字的理解


volatile时java虚拟机提供的轻量级同步机制


1.1 保证可见性


轻量级volatile会及时通知各个线程主内存中变量的变化


1.2 不保证原子性


某个线程做某个具体业务时候,中间不可以被加塞或者被分割,需要完整的完成,可以与实务类比。


20200719134028908.png

num++ 在多线程情况下是非线程安全的,去和不加synchronized来解决呢?


  • 太重量不建议用


1.3 禁止指令重排


避免多线程环境下出现乱序执行的现象


20200719142555643.png

1.4 你在哪里使用过volatile?


单例模式:


二、JMM内存模型


它是一种抽象的概念,并不存在,他描述的是一种规范和约束规定。通过这组规定定义了程序中各个变量的访问方式。


主内存是共享内存区域,所有的县城都可以访问,线程使用必须拷贝到自己的内存空间,操作完成后再写会主内存。


线程之间无法访问对方的工作内存。


JMM规定:


线程解锁前,必须把共享变量的值刷新回主内存

线程加锁前,必须读取主内存的最新值到自己的工作内存

枷锁和解锁是通一把锁


三、CAS


3.1 概念


CAS比较与交换CompareAndSet(),是CPU并发原语。

原语:连续,不允许中断,原子指令,不会造成线程不安全。

202007191536150.png

真实值与期望值相同 true 修改成功

也就是比较主内存与工作内存中的值。

Unsafe类是CAS的核心类,由于Java无法直接访问底层,需要通过native方法来访问,基于该类可以直接操作特定内存的数据。


如果使用Synchronized 在同一时间段只有一个线程使用,降低了高并发性。

如果使用CAS比较,一致性,并发性都得到了保证。


3.2 CAS缺点


没有枷锁,虽然保证了一致性,提高了并发,但是需要多次比较。


循环时间长do while(),如果CAS失败,自旋,长时间不成功,给CPU带来很大的开销。

只能保证一个共享变量的原子性

ABA问题 *****很重要!!!


3.3 原子类AtomicInteger的ABA问题谈谈?

【狸猫换太子】


20200719163612956.png



比如右侧的线程时间比较快,从主内存中copy了A,然后改回B再写回主内存为B,10S的时候,左侧的线程比较主内存,结果没有变化,觉得并没有动,操作成功,过程是有问题的,主内存中的数据已经被右侧的线程修改了!


如何解决ABA问题?

+ 1.原子引用来解决

20200719164607203.png


+ 2.修改版本号【类似时间戳】

演示ABA问题


2020071917051381.png


版本号时间戳解决问题:


20200719171202660.png

20200719171320234.png

20200719172134312.png20200719171937979.png

目录
相关文章
|
4月前
|
存储 安全 Java
Java面试题:深入探索Java内存模型,Java内存模型中的主内存与工作内存的概念,Java内存模型中的happens-before关系,volatile关键字在Java内存模型中的作用
Java面试题:深入探索Java内存模型,Java内存模型中的主内存与工作内存的概念,Java内存模型中的happens-before关系,volatile关键字在Java内存模型中的作用
37 1
|
4月前
|
缓存 安全 算法
Java面试题:如何通过JVM参数调整GC行为以优化应用性能?如何使用synchronized和volatile关键字解决并发问题?如何使用ConcurrentHashMap实现线程安全的缓存?
Java面试题:如何通过JVM参数调整GC行为以优化应用性能?如何使用synchronized和volatile关键字解决并发问题?如何使用ConcurrentHashMap实现线程安全的缓存?
41 0
|
2月前
|
存储 缓存 安全
【Java面试题汇总】多线程、JUC、锁篇(2023版)
线程和进程的区别、CAS的ABA问题、AQS、哪些地方使用了CAS、怎么保证线程安全、线程同步方式、synchronized的用法及原理、Lock、volatile、线程的六个状态、ThreadLocal、线程通信方式、创建方式、两种创建线程池的方法、线程池设置合适的线程数、线程安全的集合?ConcurrentHashMap、JUC
【Java面试题汇总】多线程、JUC、锁篇(2023版)
|
6月前
|
存储 缓存 安全
面试官:说说volatile底层实现原理?
面试官:说说volatile底层实现原理?
498 5
面试官:说说volatile底层实现原理?
|
3月前
|
缓存 安全 Java
面试官:说说volatile应用和实现原理?
面试官:说说volatile应用和实现原理?
44 1
|
3月前
|
Java 程序员 容器
【多线程面试题二十四】、 说说你对JUC的了解
这篇文章介绍了Java并发包java.util.concurrent(简称JUC),它是JSR 166规范的实现,提供了并发编程所需的基础组件,包括原子更新类、锁与条件变量、线程池、阻塞队列、并发容器和同步器等多种工具。
|
3月前
|
缓存 Java
【多线程面试题二十三】、 说说你对读写锁的了解volatile关键字有什么用?
这篇文章讨论了Java中的`volatile`关键字,解释了它如何保证变量的可见性和禁止指令重排,以及它不能保证复合操作的原子性。
|
3月前
|
缓存 Java 编译器
一文搞懂volatile面试题
这篇文章是关于Java关键字volatile的详细介绍和分析,volatile是多线程访问共享变量时保证一致性的方案,性能优于synchronized,但不保证操作原子性,需要同步处理。
|
4月前
|
缓存 安全 Java
Java面试题:解释volatile关键字的作用,以及它如何保证内存的可见性
Java面试题:解释volatile关键字的作用,以及它如何保证内存的可见性
74 4
|
4月前
|
设计模式 缓存 安全
Java面试题:工厂模式与内存泄漏防范?线程安全与volatile关键字的适用性?并发集合与线程池管理问题
Java面试题:工厂模式与内存泄漏防范?线程安全与volatile关键字的适用性?并发集合与线程池管理问题
57 1