6.可见性关键字(volidate)

可见性关键字(volidate):

如果对java内存模型了解较清楚的话,我们知道每个线程都会被分配一个线程栈。

线程栈里存的是对象的引用,但当前cache缓存机制,可能会把数据拷贝。

就是,命中缓存,去数据是从cache中获取,而不是从本地内存读取。

不加关键字实例:

package com.xm.thread.t_19_01_27;

import java.util.concurrent.TimeUnit;

public class VolatileDemo implements Runnable{

    Boolean state = false;
    volatile int count = 0;

    @Override
    public void run() {
        if(state==true || count<10) {
            count ++;
            System.out.println("state="+state+";count="+count);
        } else {
            System.out.println("state="+state+";count="+count);
        }
    }

    public static void main(String[] args) throws InterruptedException {
        VolatileDemo demo = new VolatileDemo();
        for(int i=0;i<100;i++) {
            new Thread(demo).start();
        }

        TimeUnit.MILLISECONDS.sleep(10);
        demo.state = true;

        TimeUnit.MILLISECONDS.sleep(10);
        demo.state = false;

        TimeUnit.MILLISECONDS.sleep(10);
        demo.state = true;
    }
}

运行结果:

state=false;count=2
state=false;count=2
state=false;count=3
state=false;count=2
state=false;count=4
state=false;count=5
state=false;count=6
state=false;count=7
state=false;count=8
state=false;count=9
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=true;count=19
state=true;count=18
state=true;count=17
state=true;count=16
state=true;count=15
state=true;count=15
state=true;count=15
state=true;count=13
state=true;count=12
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10

加关键字实例:

package com.xm.thread.t_19_01_27;

import java.util.concurrent.TimeUnit;

public class VolatileDemo implements Runnable{

    volatile Boolean state = false;
    volatile int count = 0;

    @Override
    public void run() {
        if(state==true || count<10) {
            count ++;
            System.out.println("state="+state+";count="+count);
        } else {
            System.out.println("state="+state+";count="+count);
        }
    }

    public static void main(String[] args) throws InterruptedException {
        VolatileDemo demo = new VolatileDemo();
        for(int i=0;i<100;i++) {
            new Thread(demo).start();
        }

        TimeUnit.MILLISECONDS.sleep(10);
        demo.state = true;

        TimeUnit.MILLISECONDS.sleep(10);
        demo.state = false;
    }
}

运行结果:

state=false;count=1
state=false;count=2
state=false;count=3
state=false;count=4
state=false;count=5
state=false;count=6
state=false;count=7
state=false;count=8
state=false;count=9
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=true;count=12
state=false;count=10
state=true;count=14
state=true;count=17
state=true;count=18
state=true;count=21
state=true;count=25
state=true;count=28
state=false;count=10
state=true;count=31
state=true;count=32
state=true;count=33
state=true;count=35
state=true;count=29
state=true;count=28
state=true;count=26
state=true;count=24
state=true;count=23
state=true;count=22
state=true;count=20
state=true;count=19
state=true;count=17
state=true;count=15
state=true;count=13
state=true;count=11
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=false;count=10
state=true;count=42
state=true;count=41
state=true;count=41
state=true;count=40
state=true;count=39
state=true;count=39
state=true;count=39
state=true;count=34
state=true;count=31

结果分析:

volidate就是保证每次读数据都会从内存中读取,但只是保证多线程内共享资源的可见性。

可见性,只是保证取出来的数据是当前内存中放的数据,但无法保证数据一定写入正确。

原文地址:https://www.cnblogs.com/TimerHotel/p/thread06.html