Volatile&原子性、核心概述
Volatile关键字核心概念与应用
Volatile关键字内存模型分析
Volatile关键字happens-before与内存屏障概念、重排序
Atomic类关键字
Atomic类实战应用爬坑手记
JDK Unsafe类使用与CAS原子特性
Volatile概念:Volatile关键字的主要作用是使变量在多个线程间可见。
作用: 在多线程间可以进行变量的变更,使得线程间进行数据的共享可见
阻止指令重排序,happens-before
package com.bfxy.thread.core.cas;
public class UseVolatile extends Thread {
private volatile boolean isRunning = true;
private void setRunning(boolean isRunning) {
this.isRunning = isRunning;
}
public void run(){
System.err.println("进入run方法...");
while(isRunning == true) {
//....
}
System.err.println("线程停止!");
}
public static void main(String[] args) throws InterruptedException {
UseVolatile uv = new UseVolatile();
uv.start();
Thread.sleep(2000);
//修改isRunning = false
uv.setRunning(false);
System.err.println("isRunning的值已经被设置成了false!");
}
}
如果不加关键字volatile :只是对对象中参数进行设置,对run方法逻辑没有影响
用volatile 修饰变量,通过改变变量控制线程是否结束;通过volatile修饰指定变量对run方法有影响
volatile 执行原理:
内存模型:
一个线程可以执行的操作有使用(use)、赋值(assign)、装载(load)、存储(store)、
锁定(lock)、解锁(unlock)。
而主内存可以执行的操作有读(read)、写(write)、锁定(lock)、解锁(unlock),每
个操作都是原子的。
volatile的作用就是强制线程到主内存(共享内存)里去读取变量,而不去线程工作内存区里
去读取,从而实现了多个线程间的变量可见。也就是满足线程安全的可见性。