• Volatile关键字


    Volatile 关键字的作用是变量在多个线程之间可见。

    该程序,主线程中已经将传入参数改为了"false",可是程序并不会终止执行。

    原因:线程之间是不可见的,线程读取的共享变量是主内存的副本(线程本地内存),没有及时读取到主内存的最新结果。

    解决办法:使用Volatile 关键字解决线程之间的可见性,强制线程每次读取该值的时候都去主内存中取值。

    注:Volatile是非原子性的,不能保证线程安全,如:

    该程序本意是启动十个线程,每个线程将静态变量的结果加1000,由于Volatile是非原子性,不能保证线程安全,所以运行结果有误,如:

    解决这个问题,可以使用并发包中 AtomicInteger 来解决,如:

    Volatile与synchronized的区别

    仅靠volatile 不能保证线程的安全性。(原子性)

    1.volatile 轻量级,只能修饰变量,synchronized 重量级,不仅能修饰变量,还可以修饰方法。

    2.volatile 只能保证数据的可见性,不能用来做同步,因为多个线程并发访问volatile 修饰的变量不会阻塞。

       synchronized不仅可以保证可见性,而且还保证原子性。因为,只有获得锁的线程才能进入临界区。

       从而保证临界区中所有的语句全部执行。多个线程争抢synchronized锁对象时,会出现阻塞。 

    线程安全性

    线程安全性包括两个方面,①可见性,②原子性

    从上面自增的例子中可以看出,仅仅使用volatile 并不能保证线程安全性。而synchronized 则可以实现线程安全性。

  • 相关阅读:
    支付清结算之基本概念和入门
    支付清结算之账户和账务处理
    支付系统设计:支付系统的账户模型(一)
    Docker架构和原理
    Docker容器的原理、特征、基本架构、与应用场景
    Docker的用途与原理
    Random函数的安全性问题与SecureRandom
    nginx配置https
    CentOS Docker 安装
    Nginx能做什么
  • 原文地址:https://www.cnblogs.com/zyybb/p/10973658.html
Copyright © 2020-2023  润新知