zoukankan      html  css  js  c++  java
  • 关于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关键字解析(详细见该文档)

  • 相关阅读:
    Mayan游戏 (codevs 1136)题解
    虫食算 (codevs 1064)题解
    靶形数独 (codevs 1174)题解
    黑白棋游戏 (codevs 2743)题解
    神经网络 (codevs 1088) 题解
    The Rotation Game (POJ 2286) 题解
    倒水问题 (codevs 1226) 题解
    银河英雄传说 (codevs 1540) 题解
    生日蛋糕 (codevs 1710) 题解
    第一章 1.11 高阶函数
  • 原文地址:https://www.cnblogs.com/snowwhite/p/9410947.html
Copyright © 2011-2022 走看看