zoukankan      html  css  js  c++  java
  • Java基础

    Java基础 - 并发包

    一、什么是CAS

      CAS的全称为 Compare-And-Swap,直译就是对比并交换。是一条CPU的原子指令,其作用是让 CPU 先进行比较两个值是否相等,然后原子地更新某个位置的值,

    经过调查发现,其实现方式是基于硬件平台的汇编指令,就是说CAS是靠硬件实现的,JVM只是封装了汇编调用,那些AtomicInteger类便是使用了这些封装后的接口。

        简单解释:CAS操作需要输入两个数值,一个旧值(期望操作前的值)和一个新值,在操作期间先比较下在旧值有没有发生变化,

    如果没有发生变化,才交换成新值,发生了变化则不交换。

        CAS操作是原子性的,所以多线程并发使用CAS更新数据时,可以不使用锁。JDK中大量使用了CAS来更新数据而防止加锁(synchronized 重量级锁)来保持原子更新。

    二、原子类

     java.util.concurrent包都中的实现类都是基于 volatile 和 CAS 来实现的。尤其java.util.concurrent.atomic包下的原子类。

    • AtomicInteger
    • AtomicLong
    • AtomicBoolean
    • AtomicReference

    三、ConcurrentHashMap

    jdk 1.7:分段锁

    jdk 1.8:node 数组 + 链表/红黑树,并发控制 使用 synchronized 和 CAS 来操作。

    四、Lock

    Lock 和 synchronized 代码块的主要不同点:

    • synchronized 代码块不能够保证进入访问等待的线程的先后顺序。
    • 你不能够传递任何参数给一个 synchronized 代码块的入口。因此,对于 synchronized 代码块的访问等待设置超时时间是不可能的事情。
    • synchronized 块必须被完整地包含在单个方法里。而一个 Lock 对象可以把它的 lock() 和 unlock() 方法的调用放在不同的方法里。

    五、执行器服务 ExecutorService

    java.util.concurrent.ExecutorService 接口表示一个异步执行机制,使我们能够在后台执行任务。

    因此一个 ExecutorService 很类似于一个线程池。实际上,存在于 java.util.concurrent 包里的 ExecutorService 实现就是一个线程池实现。

    ThreadPoolExecutor

    六、BlockingQueue

    java.util.concurrent 包里的 BlockingQueue 接口表示一个线程安放入和提取实例的队列。本小节我将给你演示如何使用这个 BlockingQueue。

    BlockingQueue 通常用于一个线程生产对象,而另外一个线程消费这些对象的场景。

    参考资料:

    Java 并发工具包 java.util.concurrent 用户指南

    Java中的13个原子操作类总结

    java原子类原理与CAS

    详解java并发原子类AtomicInteger(基于jdk1.8源码分析)

  • 相关阅读:
    python的参数传递
    django的objects级别的权限控制
    django如何将mysql数据库转化为model
    django的orm查询使用in的保序
    多用户OFDM系统资源分配研究
    第一代到第四代多址技术:从FDMA、TDMA、CDMA到OFDMA
    Kaggle比赛总结
    4 二维数组中的查找 JavaScript
    5 替换空格 JavaScript
    简单的HTTP协议
  • 原文地址:https://www.cnblogs.com/wangwangfei/p/13635392.html
Copyright © 2011-2022 走看看