美文网首页
Java关键字Synchronized和Volatile的区别

Java关键字Synchronized和Volatile的区别

作者: 筱南独舞 | 来源:发表于2016-07-28 21:46 被阅读256次
    1. 关键字volatile是线程同步的轻量级实现,所以volatile性能肯定比synchronized要好,并且volatile只能修饰于变量,而synchronized可以修饰方法,以及代码块。随着JDK版本的升级,synchronized关键字在 执行效率上得到很大提升,在开发中使用synchronized关键字的比率还是比较大的。
    2. 多线程访问volatile不会发生阻塞,而synchronized会出现阻塞。
    3. volatile能保证数据的可见性,但不能保证原子性;而synchronized可以保证原子性,也可以间接保证可见性,因为它将私有内存和公共内存中的数据做同步。
    4. 值得强调的是:关键字volatile解决的是变量在多个线程之间的可见性;而关键字synchronized解决的是多线程之间访问资源的同步性。

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


    为什么说关键字volatile不能保证原子性呢,举个小例子来看看:
    <pre>int i=0;
    i++;
    </pre>
    i++的操作步骤分解如下:

    1. 从内存中取出i的值;
    2. 计算i的值;
    3. 将i的值写到内存中。
      假如在2步计算值的时候,另外一个线程也修改i的值,那么这个时候就会出现脏数据。解决的办法就是使用关键字synchronized。
      (未完待续)

    相关文章

      网友评论

          本文标题:Java关键字Synchronized和Volatile的区别

          本文链接:https://www.haomeiwen.com/subject/tsoajttx.html