测试volatile的可见性
所谓的可见性,并不是说修改后完全不可见,只是说不是立马可见,加了volatile可以保证立马可见。
测试volatile 修饰基本类型时的可见性
public class BasicTypeVolatileDemo{
//加上volatile 和不加volatile 效果非常明显
volatile static int a=1;
public static void main(String[] args) throws InterruptedException {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"线程启动了");
while(true) {
//当a=3 跳出死循环
if(a==3) {
break;
}
}
System.out.println(Thread.currentThread().getName()+"线程停止了");
}
},"t2").start();
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"线程启动了");
while(true) {
//当a=3 跳出死循环
if(a==3) {
break;
}
}
System.out.println(Thread.currentThread().getName()+"线程停止了");
}
},"t1").start();
//sleep 的目的就是让上面两个线程都启动起来
Thread.sleep(1000);
//在主线程里边修改变量,测试其他线程是否对这个修改可见
a=3;
}
}
如果不加volatile关键字的话,程序会一直运行,不会结束,加上的话程序会结束。
测试volatile 修饰数组类型时的可见性
public class RefTypeVolatileDemo {
volatile static int [] a=new int[] {1,3,4};
public static void main(String[] args) throws InterruptedException {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"线程启动了");
while(true) {
if(a[1]==10) {
break;
}
}
System.out.println(Thread.currentThread().getName()+"线程停止了");
}
},"t2").start();
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"线程启动了");
while(true) {
//当a=3 跳出死循环
if(a[1]==10) {
break;
}
}
System.out.println(Thread.currentThread().getName()+"线程停止了");
}
},"t1").start();
//sleep 的目的就是让上面两个线程都启动起来
Thread.sleep(1000);
//在主线程里边修改变量,测试其他线程是否对这个修改可见
a[1]=10;
}
}
如果不加volatile关键字的话,程序会一直运行,不会结束,加上的话程序会结束。但是网上有部分观点说是volatile不能保证数据内元素的可见性,只能保证引用的可见性,所以现在我也比较懵逼了,欢迎留言讨论