zoukankan      html  css  js  c++  java
  • 关于java多线程关键字volatile的理解

    volatile关键字的作用是强制从公共堆栈中取得变量的值,而不是从线程私有数据栈中取得变量的值。

    使用volition关键字增加了实例变量在多个线程间的可见性。但volition有个致命的缺点就是不支持原子性

    下面将volition和synchronized关键字进行一下比较:

    1.volition是线程同步间的轻量级实现,所以volition性能肯定比synchronized性能好,volition只能修饰变量。

    2.多线程访问volition不会发生阻塞,而synchronized会阻塞。

    3.volition能保证数据的可见性,而不能保证原子性;而synchronized既可以保证原子性,也可以间接保证可见性。

    4.再次强调,关键字volition解决的是变量在多个线程之间的可见性;而synchronized关键字解决的是多个线程之间访问资源的同步性。

    线程安全包含原子性和可见性两个方面,java的同步机制都是围绕这两个方面来却保线程安全的。

    关键字volition主要使用的场合是在多个线程中可以感知共享变量被更改了,并且可以获得最新的值使用,也就是用多线程读取共享变量可以获取最新值使用

    关键字volition提示线程每次从共享内存中读取变量,而不是从私有内存中读取,这样保证了数据的可见性。

    但是要注意,如果代码中有i++,也就是i=i+1时,这样的操作不是一个原子操作,也就是时非线程安全的。具体可以了解下i++的实际意义;

    ①从内存中读取变量i

    ②计算i的值

    ③将i的值写到内存中

    加如两个线程同时执行到这段代码,那有可能就会出现脏数据,解决办法就是加synchronized字。

    其实除了用synchronized,还可以用原子类解决。

    这样可以代替i++,还不要加同步锁。

    另外要说下synchronized关键字也能确保数据可见性。

    最后学习多线程八字真经“外练互斥,内修可见”。

  • 相关阅读:
    PowerDesigner通过SQL文件,反向生成模型
    跨域请求设置
    SSO单点登录与登出
    jwt使用
    git概念理解
    Slf4j MDC机制
    ASP.NET Core依赖注入最佳实践,提示&技巧
    EFCore数据库迁移命令整理
    RSA加密的使用
    CocoaPods 安装的第三方删除
  • 原文地址:https://www.cnblogs.com/shamo89/p/6661985.html
Copyright © 2011-2022 走看看