1、volatile使变量在多个线程间可见
private volatile int a
;</br>
a
始终在线程间保持一致性,一方修改,其他方立马识别出来相应的变化。</br>
原来的做法是:使用加锁,保证变量被锁,修改完后,将修改后的值同步到共享内存中,其他线程获取锁再去使用,效率不高,同一时刻只有一个在使用。</br>
JKD1.5后,每一个线程做了个优化,每个线程有独立的内存空间(线程工作内存),将主内存中线程引用的对象或变量副本COPY到该独立内存空间,目的是效率更高,省了每次到主内存中取。
public class RunThread extends Thread{
private volatile boolean isRunning = true;
private void setRunning(boolean isRunning){
this.isRunning=isRunning;
}
public void run(){
System.out.println("进入run方法..");
while(isRunning==true){}
System.out.println("线程停止");
}
public static void main(String[] args) throws InterruptedException {
RunThread rt = new RunThread();
rt.start();
Thread.sleep(3000);
rt.setRunning(false);
System.out.println("isRunning的值已经被设置了false");
Thread.sleep(1000);
System.out.println(rt.isRunning);
}
}
上述是两个线程引用同一个变量isRunning,其中main为主线程。</br>
isRunning变量如果被volatile修饰,则当变量改变时强制引用isRunning的线程使用线程执行引擎去主内存里去读取。</br>
volatile
只具备可见性,但不具备原子性。
private static volatile int count
;需要使用private static AtomicInteger count = new AtomicInteger(0)
;代替,注意不能保证多个线程间的多个addAndGet
原子性,只能加锁。