标签:共享 在线 工作 不可 可见性 因此 地方 [] 关键字
被volatile修饰的变量能够保证每个线程能够获取该变量的最新值,从而避免出现数据脏读的现象。
当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的,因此不会将该变量上的操作与其他内存操作一起重排序。volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此在读取volatile类型的变量时总会返回最新写入的值。在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞,因此volatile变量是一种比sychronized关键字更轻量级的同步机制。
eg
public class VolatileTest {
public static volatile int i = 0 ;
public static class VTTest implements Runnable{
@Override
public void run() {
for (int j = 0; j < 1000; j++) {
i++; //可以理解为3步,1:读到工作内存,2:进行+1计算 3:写入新的i+1
System.out.println(Thread.currentThread().getId() + ":" + i);
}
}
}
public static void main(String[] args) throws InterruptedException {
Thread[] t = new Thread[10];
for (int i = 0; i < 10; i++) {
t[i] = new Thread(new VTTest());
t[i].start();
}
for (int i = 0; i < 10; i++) {
t[i].join();
}
}
}
eg
public class VolatileTest {
public static volatile int i = 0 ;
public static ReentrantLock lock = new ReentrantLock();
public static class VTTest implements Runnable{
@Override
public void run() {
for (int j = 0; j < 1000; j++) {
lock.lock();
i++; //i = i + 1;非原子操作
System.out.println(Thread.currentThread().getId() + ":" + i);
lock.unlock();
}
}
}
public static void main(String[] args) throws InterruptedException {
Thread[] t = new Thread[10];
for (int i = 0; i < 10; i++) {
t[i] = new Thread(new VTTest());
t[i].start();
}
for (int i = 0; i < 10; i++) {
t[i].join();
}
}
}
标签:共享 在线 工作 不可 可见性 因此 地方 [] 关键字
原文地址:https://www.cnblogs.com/Ch1nYK/p/9073900.html