volatile关键字

volatile关键字的意思是要让共享及时通知java

多个线程同时共享lock变量。缓存

源于JMM  JAVA 内存模型中的线程的【工做内存】+【主内存】相似于真实CPU的【缓存】+【内存】ide

多个线程共享变量  a,则每一个每一个线程都会在本身的工做内存中保留一份副本!这就会带来多个工做内存之间的副本在本身读写的时候,会致使不一致!线程

一、加了volatile修饰的变量,若是有一个线程对其进行写操做,code

A、强制其必定要刷新写到主内存中!内存

B、其余线程工做内存中的副本都会失效!必须到主内存中去从新获取,刷新!io

C、这样就保证了共享变量内存的及时可见性!class

1、如下是使用volatile修饰共享变量(这里当作信号量)变量

public class Test {
    private volatile int lock = 1;
    public void volatileTest() {
        Runnable runnable1 = new Runnable() {
            @Override
            public void run() {
                int n = 0;
                while (lock == 1){
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("T1--"+ n++ +":runnable is running...");
                }
                System.out.println("T1--"+ n+":runnable is run out...");
            }
        };
        Runnable runnable2 = new Runnable() {
            @Override
            public void run() {
                int n = 0;
                while (lock == 1){
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("T2--"+ n++ +":runnable is running...");
                }
                System.out.println("T2--"+ n+":runnable is run out...");
            }
        };
        Runnable runnable3 = new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(3000);
                    System.out.println("我要中断你!!!!");
                    lock = 0;
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
        Thread t1 =  new Thread(runnable1);
        Thread t2 =  new Thread(runnable2);
        Thread t3 =  new Thread(runnable3);
        t1.start();
        t2.start();
        t3.start();
    }
}

结果以下:while

T2--0:runnable is running...
T1--0:runnable is running...
T2--1:runnable is running...
T1--1:runnable is running...
我要中断你!!!!
T2--2:runnable is running...
T1--2:runnable is running...
T1--3:runnable is run out...
T2--3:runnable is run out...
相关文章
相关标签/搜索