zoukankan      html  css  js  c++  java
  • Volatile关键字

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

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

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

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

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

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

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

    Volatile与synchronized的区别

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

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

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

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

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

    线程安全性

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

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

  • 相关阅读:
    C#编程概念系列内容索引
    Latin1_General_BIN
    C#编程概念系列(一):面向对象编程
    System.Web.HttpException: 为 ChartImg.axd 执行子请求时出错
    Excel导入数据到数据库
    C#编程概念系列(二):应用程序域
    ASP.NET 基础结构
    [博]留作证明是原创样式
    [整]网址搜集
    仅为调博客样式
  • 原文地址:https://www.cnblogs.com/zyybb/p/10973658.html
Copyright © 2011-2022 走看看