volatile的作用是强制从公共堆栈(存储实例对象值的区域)中取得变量的值,而不是从线程的私有数据栈中取得变量的值,当一个变量被volatile修饰的时候,每次读取这个值都需要删除自身私有数据域的值,然后强迫从公共内存区域取得这个变量的最新值。
方法 | 含义 |
volatile | 保证变量的对于多个线程的可见性,不保证操作的原子性 |
sychronized | 保证变量对于多个线程的可见性,同时保证操作的原子性 |
例子1:volatile不保证变量操作的原子性
package javaPratice;
class VThread extends Thread{
volatile public static int count=0;
private static void addCount(){
for(int i=0;i<100;i++){
count++;
}
System.out.println("count="+count);
}
public void run(){
addCount();
}
}
public class VolatileAtomic {
public static void main(String args[]){
VThread[] objectVThread = new VThread[100];
for(int i=0;i<100;i++){
objectVThread[i]= new VThread();
}
for(int i=0;i<100;i++){
objectVThread[i].start();;
}
}
}
改进保证变量的操作的原子性:
class VThread extends Thread{
volatile public static int count=0;
synchronized private static void addCount(){
for(int i=0;i<100;i++){
count++;
}
System.out.println("count="+count);
}
public void run(){
addCount();
}
}