zoukankan      html  css  js  c++  java
  • Java并发复习笔记

    1.并发编程三大特性——原子性、可见性、有序性

    1).原子性(Lock、synchronized可以保证原子性,volatile无法保证原子性)
    原子性是指一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。
    2).可见性(volatile可保证可见性,synchronized、Lock也能保证可见性)
    可见性是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。
    3).有序性(volatile可保证有序性,因为可禁止重排序,synchronized、Lock也可保证有序性)
    即程序执行的顺序按照代码的先后顺序执行。
     

    2.Java内存模型(JMM)是什么?

    所有的变量都存储在主内存中,每个线程还有自己的工作内存,线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不能直接读取主内存中的变量。不同线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递均需要通过主内存来完成。
     

    3.volatile作用是什么?volatile使用时的注意事项。

    volatile的两个语义:1)保证变量对所有线程的可见性,即某个线程修改了这个变量的值后,新值对其他线程来说是立即可见的。2)禁止指令重排序优化
     
    volatile的适用情况如下(因为volatile无法保证原子性)
    1)运算结果并不依赖变量的当前值,或者能够确保只有单一的线程修改变量的值。
    举例:volatile int i; i++就依赖i原来的值,所以不适用
    2)变量不需要与其他的状态变量共同参与不变约束。
     

    4.synchronized的实现原理

    synchronized关键字经过编译之后,会在同步块的前后形成monitorenter和monitorexit两个字节码指令。
    JVM在执行monitorenter时会尝试获取锁,执行monitorexit时会尝试释放锁。
     

    5.CAS是什么?使用CAS注意事项以及如何解决?

    compareAndSwap,比较并交换。
    CAS存在ABA问题。使用JDK atomic包中的AtomicStampedReference可解决ABA问题。
     

    6.happens-before原则

    程序次序规则:一个线程内,按照代码顺序,书写在前面的操作先行发生于书写在后面的操作。
    锁定规则:一个unLock操作先行发生于后面对同一个锁额lock操作。
    volatile变量规则:对一个变量的写操作先行发生于后面对这个变量的读操作。
    传递规则:如果操作A先行发生于操作B,而操作B又先行发生于操作C,则可以得出操作A先行发生于操作C。
    线程启动规则:Thread对象的start()方法先行发生于此线程的每个一个动作。
    线程中断规则:对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生。
    线程终结规则:线程中所有的操作都先行发生于线程的终止检测,我们可以通过Thread.join()方法结束、Thread.isAlive()的返回值手段检测到线程已经终止执行。
    对象终结规则:一个对象的初始化完成先行发生于他的finalize()方法的开始。
     

    7.JVM对锁的优化(偏向锁、轻量级锁、重量级锁)

    偏向锁:仅有一个线程获取锁时,不加锁
    轻量级锁:竞争不激烈时,乐观锁,CAS
    重量级锁:竞争激烈时,悲观锁
  • 相关阅读:
    Vasya and Endless Credits CodeForces
    Dreamoon and Strings CodeForces
    Online Meeting CodeForces
    数塔取数 基础dp
    1001 数组中和等于K的数对 1090 3个数和为0
    1091 线段的重叠
    51nod 最小周长
    走格子 51nod
    1289 大鱼吃小鱼
    POJ 1979 Red and Black
  • 原文地址:https://www.cnblogs.com/yeyang/p/13589910.html
Copyright © 2011-2022 走看看