volitte关键字解决线程共享变量可见性

java内存模型

视频讲解:https://ke.qq.com/webcourse/index.html#cid=230866&term_id=100272363&taid=3625454909228498&type=1024&vid=5285890791029400023

 

 

package com.itcast.jmm;

/**
 * volatile可以保证线程可见性和有序性
 */
public class volatileTest {

//    private static    boolean flag = false;
    private static volatile   boolean flag = false;

    public static void main(String[] args) throws InterruptedException {


        new Thread(new Runnable() {
            @Override
            public void run() {

                while (!flag) {
                }
                System.out.println("数据准备完毕,开始执行业务操作");
            }
        }).start();

        Thread.sleep(2000);

        new Thread(new Runnable() {
            @Override
            public void run() {

                System.out.println("数据开始准备");
                flag = true;
                System.out.println("数据准备完毕");
            }
        }).start();

        Thread.sleep(Integer.MAX_VALUE);
    }

}
数据开始准备
数据准备完毕
数据准备完毕,开始执行业务操作

 

 

package com.itcast.jmm;

/**
 * volatile可以保证线程可见性和有序性,但是无法保证原子性
 */
public class AtomicTest {

    private static volatile int num = 0;

    public static void main(String[] args) throws InterruptedException {

        Thread[] threads = new Thread[10];

        for (int i = 0; i < threads.length; i++) {
            threads[i] = new Thread(new Runnable() {
                @Override
                public void run() {
                    for (int j = 0; j < 10000; j++) {
                        //这里必须使用Integer.class 全局锁对象(如果有synchronized的话,去掉volatile关键字也正确达到100000)
                        //这里不加锁,就会导致num结果小于100000
                        synchronized (Integer.class) {
                            num++;
                        }
                    }
                }
            });
            threads[i].start();
        }

        //主线程等待全部子线程执行完,才结束
        for (Thread thread : threads) {
            thread.join();
        }
        System.out.println(num); //10*10000=100000
//        Thread.sleep(Integer.MAX_VALUE);
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值