谈谈你对voliatle的理解

一、谈谈你对voliatle的理解

 

 

1.voliatle是Java虚拟机提供的轻量级的同步机制

  • 保证可见性
  • 不保证原子性
  • 禁止指令重排

2.JMM你谈谈(线程安全性得到保证)

  • 可见性
  • 原子性
  • VolatileDemo代码演示可见性+原子性代码
    package com.interview;
    
    import java.util.concurrent.TimeUnit;
    import java.util.concurrent.atomic.AtomicInteger;
    
    class MyData {
        volatile int number = 0;
    
        public void addTo60() {
            this.number = 60;
        }
        //注意 此时number不保证原子性
        public void addPlusPlus(){
            number++;
        }
    
        AtomicInteger atomicInteger=new AtomicInteger();
        public void addMyAtomic(){
            atomicInteger.getAndIncrement();
        }
    
    }
    public class VoliatleDemo {
        /**
         * 1 验证volatile的可见性
         *   1.1.假如int number=0;number变量之前根本没有添加volatile关键字修饰 没有可见性
         *   1.2 添加了volatile可以解决可见性问题
         *
         * 2 验证volatile不保证原子性
         *  2.1 原子性指的是什么意思?
         *     不可分割 完整性 也即某个线程正在做某个具体业务时 中间不可以被加塞或者分割。 需要整体完整要么同时成功 要么同时失败。
         *  2.2 是否可以保证原子性的案例
         *
         * @param args
         */
        public static void main(String[] args) {
            seyOkByVolatile();
    
            MyData myData  =  new MyData();//资源类
            for (int i = 1; i <20 ; i++) {
                new Thread(() -> {
                    for (int j = 1; j <1000 ; j++) {
                        myData.addPlusPlus();
                        myData.addMyAtomic();
                    }
                },String.valueOf(i)).start();
            }
            //需要等待上面20个线程都全部计算完成后 再用mian线程取得最终的结果值看是多少?
            while(Thread.activeCount() >2 ){//说明线程还没有算完
                Thread.yield();//礼让线程
            }
            System.out.println(Thread.currentThread().getName()+"\t int type,finally number value:"+myData.number);
            System.out.println(Thread.currentThread().getName()+"\t AtomicInteger type,finally number value:"+myData.atomicInteger);
        }
        //volatile可以保证可见性。 及时通知其他线程 主物理内存的值已经修改
        private static void seyOkByVolatile() {
            MyData myData  =  new MyData();//资源类
            new Thread(() -> {
                System.out.println(Thread.currentThread().getName()+"\t come in");
                //暂停一会线程
                try {
                    TimeUnit.SECONDS.sleep(3);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                myData.addTo60();
                System.out.println(Thread.currentThread().getName()+"\t updated number value" + myData.number);
            },"AAA").start();
            while (myData.number==0){
                //mian线程就一直再这里等待循环直到number值不在等于零
            }
            System.out.println(Thread.currentThread().getName()+"\t mission is over");
        }
    }
    
  • 有序性

加了volatile,禁止指令重排

指令重排案例

public class ReSortSeqDemo {
    int a=0;
    boolean flag=false;
    public  void method01(){
        a=1;
        flag=true;
    }
    //多线程环境中线程交替执行由于编译器优化重排的存在
    //俩个线程中使用的变量能否保证一致性是无法确定的 结果无法预测
    public  void method02(){
        if(flag){
            a=a+5;
            System.out.println("teValue"+a);
        }
    }
}

 

3.你在那些地方用过volatile?

  • 单例模式 DCL代码
  • 单例模式volatile分析
public class SingletonDemo {
    private static volatile SingletonDemo instance=null;
    private SingletonDemo(){
        System.out.println(Thread.currentThread().getName()+"\t 我是构造方法SingletonDemo");
    }
    //DCL Double Check Lock 双端检索机制
    public static  SingletonDemo getInstance(){
        if(instance == null){
            synchronized (SingletonDemo.class){
                if(instance==null){
                    instance=new SingletonDemo();
                }
            }

        }
        return instance;
    }
    public static void main(String[] args){
      /*  //单线程(main线程的操作动作)
        System.out.println(SingletonDemo.getInstance()==SingletonDemo.getInstance());
        System.out.println(SingletonDemo.getInstance()==SingletonDemo.getInstance());
        System.out.println(SingletonDemo.getInstance()==SingletonDemo.getInstance());
    */
        for (int i = 1; i <=10 ; i++) {
            new Thread(() -> {
                SingletonDemo.getInstance();
            },String.valueOf(i)).start();
        }
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Promise是一种用于处理异步操作的JavaScript对象。它可以将异步操作封装成一个Promise实例,通过链式调用then()方法来处理操作的结果。Promise有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。当异步操作完成时,Promise会根据操作的结果改变自身的状态,并执行相应的回调函数。 Promise的优点之一是可以避免回调地狱,即多个嵌套的回调函数导致代码难以维护和理解。通过使用Promise,可以将异步操作的处理逻辑以链式调用的方式表达出来,使代码更加清晰和可读。 Promise提供了一些静态方法,如Promise.resolve()和Promise.reject(),用于将普通的值转换为Promise对象。Promise.resolve()方法返回一个立即成功的Promise对象,而Promise.reject()方法返回一个立即失败的Promise对象。 另外,Promise还提供了Promise.all()和Promise.race()方法。Promise.all()方法接收一个Promise数组,并在所有Promise都成功时返回一个包含所有结果的Promise对象,如果有一个Promise失败,则返回一个失败的Promise对象。而Promise.race()方法接收一个Promise数组,并返回最先解决(成功或失败)的Promise对象的结果。 总之,Promise是一种用于处理异步操作的强大工具,它可以提高代码的可读性和可维护性,并提供了一些静态方法来处理多个Promise对象的结果。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* *3* [对Promise的理解](https://blog.csdn.net/liyongchunscr/article/details/120762934)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值