• 关于Sychronized和volatile自己总结的一点点理解(草稿)


    问答形式列举:

    1、 为什么说sychronized能保证可见性

          synchronized和Lock能保证同一时刻只有一个线程获取锁然后执行同步代码,并且在释放锁之前会将对变量的修改刷新到主存当中。因此可以保证可见性。

    2、 java中乐观锁和悲观锁区别,以及CAS机制是?

      独占锁是一种悲观锁,synchronized就是一种独占锁,会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。而另一个更加有效的锁就是乐观锁。所谓乐观锁就是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。乐观锁用到的机制就是CAS,Compare and Swap。

         

    3、 为什么jdk1.5后sychronized的效率就高了

    4、 volatile关键字有何作用:

         volatile关键字的两层语义

      一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:

      1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。

      2)禁止进行指令重排序。     

            Java并发编程:volatile关键字解析(详细见该文档)

    5、 单例模式中为什么有些版本的双重检测有缺陷?加了volatile关键字就可以了?

          为什么在单例类中不能使用双重检查锁来初始化对象(详细见该文档) 

          原因就是实例化对象和对象instance指向开辟内存空间可能顺序反过来,指令重排序引发问题。volatile关键字可以禁止指令重排序。

    6、 volatile的原理和实现机制    

      前面讲述了源于volatile关键字的一些使用,下面我们来探讨一下volatile到底如何保证可见性和禁止指令重排序的。 

      下面这段话摘自《深入理解Java虚拟机》:

       “观察加入volatile关键字和没有加入volatile关键字时所生成的汇编代码发现,加入volatile关键字时,会多出一个lock前缀指令” 

      lock前缀指令实际上相当于一个内存屏障(也成内存栅栏),内存屏障会提供3个功能: 

      1)它确保指令重排序时不会把其后面的指令排到内存屏障之前的位置,也不会把前面的指令排到内存屏障的后面;即在执行到内存屏障这句指令时,在它前面的操作已经全部完成; 

      2)它会强制将对缓存的修改操作立即写入主存; 

      3)如果是写操作,它会导致其他CPU中对应的缓存行无效。

         摘自:Java并发编程:volatile关键字解析(详细见该文档)

    7、 使用volatile关键字的场景   

           synchronized关键字是防止多个线程同时执行一段代码,那么就会很影响程序执行效率,而volatile关键字在某些情况下性能要优于synchronized,但是要注意volatile关键字是无法替代synchronized关键字的,因为volatile关键字无法保证操作的原子性。通常来说,使用volatile必须具备以下2个条件:

      1)对变量的写操作不依赖于当前值

      2)该变量没有包含在具有其他变量的不变式中

      实际上,这些条件表明,可以被写入 volatile 变量的这些有效值独立于任何程序的状态,包括变量的当前状态。

      事实上,我的理解就是上面的2个条件需要保证操作是原子性操作,才能保证使用volatile关键字的程序在并发时能够正确执行。

      下面列举几个Java中使用volatile的几个场景。

           摘自:Java并发编程:volatile关键字解析(详细见该文档)

  • 相关阅读:
    高质量c/c++编程(10)
    .net 访问excel问题
    高质量c/c++编程(9)
    C#排序算法 之 冒泡排序
    C#排序算法 之 希尔排序
    高质量c/c++编程附录
    C#排序算法 之 插入排序
    读《漂亮女上司》有感
    高质量c/c++编程(6)
    高质量c/c++编程(5)
  • 原文地址:https://www.cnblogs.com/snowwhite/p/9410947.html
Copyright © 2020-2023  润新知