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关键字也能确保数据可见性。

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

  • 相关阅读:
    10 个深恶痛绝的 Java 异常。。
    为什么公司宁愿 25K 重新招人,也不给你加到 20K?原因太现实……
    推荐一款代码神器,代码量至少省一半!
    Spring Cloud Greenwich 正式发布,Hystrix 即将寿终正寝。。
    hdu 3853 LOOPS(概率 dp 期望)
    hdu 5245 Joyful(期望的计算,好题)
    hdu 4336 Card Collector(期望 dp 状态压缩)
    hdu 4405 Aeroplane chess(概率+dp)
    hdu 5036 Explosion(概率期望+bitset)
    hdu 5033 Building (单调栈 或 暴力枚举 )
  • 原文地址:https://www.cnblogs.com/shamo89/p/6661985.html
Copyright © 2011-2022 走看看