1. volatile 可以使得多个线程之间可见
代码示列如下:
public class RunThread extends Thread{
private volatile boolean isRunning = true;
public void setRunning(boolean isRunning){ this.isRunning = isRunning; } public void run(){ System.out.println("进入run 方法....."); while(isRunning){ // 如果为.... } System.out.println("线程结束"); } public static void main(String[] args) throws Exception{ RunThread th = new RunThread(); th.start(); Thread.sleep(3000); th.setRunning(false); System.out.println("isRunning 线程已经被设置成false"); Thread.sleep(1000); System.out.println(th.isRunning); }说明没有有在字段isRunning 前面加volatile 字段时候,执行完主函数,运行程序并没有关闭
如果加了volatile 的时候运行的程序在执行完相关操作的时候会关闭。
2.volatile 只是具有可见性,没有原子性,要实现原子性建议使用atomic 类的系列对象
列子代码如下:
普通int 类型执行
import java.util.concurrent.atomic.AtomicInteger;
/**
* volatile 不支持原子型
*
* ASUS
*
*/
public class VolatileNoAtomic extends Thread {
private static volatile int count;
private static void addCount(){
for(int i=0;i<1000;i++){
count++;
}
System.out.println(count);
}
public void run(){
addCount();
}
public static void main(String[] args){
VolatileNoAtomic[] arr = new VolatileNoAtomic[10];
for(int i=0;i<10;i++){
arr[i] = new VolatileNoAtomic();
}
for(int i=0;i<10;i++){
arr[i].start();
}
}
}
运行结果如下图所示:
1273
1615 2615 3615 4615 5615 6615 7615 8620 93472.有原子性
import java.util.concurrent.atomic.AtomicInteger;
/**
* volatile 不支持原子型
*
* ASUS
*
*/
public class VolatileNoAtomic extends Thread {
private static AtomicInteger count = new AtomicInteger();
private static void addCount(){
for(int i=0;i<1000;i++){
count.incrementAndGet();
}
System.out.println(count);
}
public void run(){
addCount();
}
public static void main(String[] args){
VolatileNoAtomic[] arr = new VolatileNoAtomic[10];
for(int i=0;i<10;i++){
arr[i] = new VolatileNoAtomic();
}
for(int i=0;i<10;i++){
arr[i].start();
}
}
}