Donnie

不积跬步无以至千里

volatile Demo

volatile是对内存的可见性,会强制将线程的工作内存刷新到主内存。
下面代码示例,如果将volatile去掉,就会造成线程t2进入死循环。

     import java.util.ArrayList;
    import java.util.List;
    import java.util.concurrent.TimeUnit;
    
    public class VolatileDemo {
    
        //如果没有volatile修饰,t2线程一直循环下去,因为不会主动的将t1的工作内存刷到主内存。
        private volatile static List list =new ArrayList();
    
        public void add() {
            list.add("test data");
        }
    
        public int size() {
            return list.size();
        }
    
        public static void main(String[] args) {
    
            final VolatileDemo listData = new VolatileDemo();
    
            Thread t1=new Thread(()->{
                try {
                    for (int i = 0; i < 20; i++) {
                        listData.add();
                        System.out.println("当前线程:" + Thread.currentThread().getName() + " 添加了一个元素");
                        TimeUnit.SECONDS.sleep(1);
                    }
    
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
            },"t1");
    
            Thread t2=new Thread(()-> {
                while (true) {
    
                    if (listData.size() == 4) {
                        System.out.println("当前线程收到通知 " + Thread.currentThread().getName() + " list size = 5 停止线程");
                        break;
                    }
    
                }
            }, "t2");
    
            t1.start();
            t2.start();
        }
    }   
赞赏支持