当前位置:网站首页>并发编程中volatile面试总结
并发编程中volatile面试总结
2022-07-23 02:30:00 【挣脱那枷锁】
并发编程的三要素
1)原子性:原子性是指一个或多个操作要么全部执行成功,要么全部执行失败。atomic类,synchronized
2)可见性:多个线程共同访问共享变量时,某个线程修改了此变量,其他线程能立即看到修改后的值(synchronized,volatile)
3)有序性:代码的执行顺序未必就是编写代码时候的顺序,由于JAVA内存模型允许编译器和处理器为了效率,进行指令重排序的优化。指令重排序在单线程内表现为串行语义,在多线程中会表现为无序。Volatile,synchronized,lock保证有序性
Java内存模型JMM中规定所有的变量都存储在主内存中,每条线程都有自己的工作内存,线程的工作内存中保存了该线程所使用的变量从主内存中拷贝的副本。线程对于变量的读、写都必须在工作内存中进行,而不能直接读、写主内存中的变量。同时,本线程的工作内存的变量也无法被其他线程直接访问,必须通过主内存完成。
volatile关键字
volatile通常被比喻成"轻量级的synchronized",volatile是一个变量修饰符,只能用来修饰变量,无法修饰方法及代码块等,保证可见性和有序性,并不保证原子性。
1)可见性:当对volatile变量执行写操作后,JMM会把工作内存中的最新变量值强制刷新到主内存,同时写操作会导致其他线程中的缓存无效,这样其他线程使用缓存时,发现本地工作内存中此变量无效,便从主内存中获取,(遵守了缓存一致性协议)把这个变量的值从主存加载到自己的缓存中。这就保证了一个volatile在并发编程中,其值在多个缓存中是可见的,实现了线程的可见性。
2)有序性:禁止指令重排序。我们在加了volatile指令修饰后,在汇编代码当中被volatile修饰的变量在被赋值之后会多了一个“lock addl $0x0,(%esp)”操作,这个操作相当于一个内存屏障Memory Barrier(指令重排序时不能把后面的指令重排序到内存屏障之前的位置,内存屏障分为两种:Load Barrier 和 Store Barrier即读屏障和写屏障,java的内存屏障通常所谓的四种即LoadLoad, StoreStore, LoadStore,StoreLoad实际上也是上述两种的组合,完成一系列的屏障和数据同步功能。
缓存一致性协议:每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是不是过期了,当处理器发现自己缓存行对应的内存地址被修改,就会将当前处理器的缓存行设置成无效状态,当处理器要对这个数据进行修改操作的时候,会强制重新从系统内存里把数据读到处理器缓存里。
3)volatile为什么不能保证原子性
CPU有时间片的概念,获得时间片之后开始执行,在时间片耗尽之后,就会失去CPU使用权。在多线程场景下,由于时间片在线程间轮换,就会发生原子性问题。为了保证原子性,需要通过字节码指令monitorenter和monitorexit,但是volatile和这两个指令之间是没有任何关系的,所以,volatile是不能保证原子性的。
synchronized 关键字 和 volatile 关键字的区别
- volatile 关键字是线程同步的轻量级实现,所以volatile 性能肯定比synchronized 关键字要好。但是volatile关键字只能用于变量而,synchronized 关键字可以修饰方法以及代码块。
- volatile 关键字能保证数据的可见性和有序性,但不能保证数据的原子性, synchronized 关键字都能保证。
- volatile 关键字主要用于解决变量在多个线程之间的可见性,而synchronized 关键字解决的是多个线程之间访问资源的同步性.
边栏推荐
猜你喜欢
随机推荐
【学习笔记】Node--从0基础到实战企业官网
Q-vision+kvaser can/can fd/lin bus solution
适合短视频分享的Fireshare
Tidb 3.0 installation
How to learn SCM based on zero?
I want to learn financial management in digging money. Is it safe to open an account?
亿级融资事件占比超30%,超自动化的下一站是何处?丨曼孚科技
LEADTOOLS 20-22 Crack-DotNetCore!!!
Redis 6.0源码学习 Simple Dynamic String
检测Windows安全缺陷工具wesng的学习与使用
567. Arrangement of strings
解密 Redis 助力双 11 背后电商秒杀系统
1、 Buildreoot directory structure
C语言力扣第39题之组合总和。回溯法与遍历法
Several important problems of port completion
【无标题】
本地提权的学习
How to determine the end point of a software test
567. 字符串的排列
seatunnel 架构









