接着来~
原子类
基本类型原子类

使用原子的方式更新基本类型

AtomicInteger:整型原子类
AtomicLong:长整型原子类
AtomicBoolean :布尔型原子类
AtomicInteger 类常用的方法:

public final int get() //获取当前的值public final int getAndSet(int newValue)//获取当前的值,并设置新的值public final int getAndIncrement()//获取当前的值,并自增public final int getAndDecrement() //获取当前的值,并自减public final int getAndAdd(int delta) //获取当前的值,并加上预期的值boolean compareAndSet(int expect, int update) //如果输入的数值等于预期值,则以原子方式将该值设置为输入值(update)public final void lazySet(int newValue)//最终设置为newValue,使用 lazySet 设置之后可能导致其他线程在之后的一小段时间内还是可以读到旧的值。

AtomicInteger 类主要利用 CAS (compare and swap) 保证原子操作,从而避免加锁的高开销。
数组类型原子类
使用原子的方式更新数组里的某个元素

AtomicIntegerArray:整形数组原子类
AtomicLongArray:长整形数组原子类
AtomicReferenceArray :引用类型数组原子类
AtomicIntegerArray 类常用方法:

public final int get(int i) //获取 index=i 位置元素的值public final int getAndSet(int i, int newValue)//返回 index=i 位置的当前的值,并将其设置为新值:newValuepublic final int getAndIncrement(int i)//获取 index=i 位置元素的值,并让该位置的元素自增public final int getAndDecrement(int i) //获取 index=i 位置元素的值,并让该位置的元素自减public final int getAndAdd(int i, int delta) //获取 index=i 位置元素的值,并加上预期的值boolean compareAndSet(int i, int expect, int update) //如果输入的数值等于预期值,则以原子方式将 index=i 位置的元素值设置为输入值(update)public final void lazySet(int i, int newValue)//最终 将index=i 位置的元素设置为newValue,使用 lazySet 设置之后可能导致其他线程在之后的一小段时间内还是可以读到旧的值。

引用类型原子类
AtomicReference:引用类型原子类
AtomicStampedReference:带有版本号的引用类型原子类。该类将整数值与引用关联起来,可用于解决原子的更新数据和数据的版本号,可以解决使用 CAS 进行原子更新时可能出现的 ABA 问题。
AtomicMarkableReference :原子更新带有标记的引用类型。该类将 boolean 标记与引用关联起来
AQS
AQS定义了一套多线程访问共享资源的同步器框架,许多并发工具的实现都依赖于它,如常用的ReentrantLock/Semaphore/CountDownLatch。

原理
AQS使用一个volatile的int类型的成员变量state来表示同步状态,通过CAS修改同步状态的值。

private volatile int state;//共享变量,使用volatile修饰保证线程可见性
同步器依赖内部的同步队列(一个FIFO双向队列)来完成同步状态的管理,当前线程获取同步状态失败时,同步器会将当前线程以及等待状态(独占或共享 )构造成为一个节点(Node)并将其加入同步队列并进行自旋,当同步状态释放时,会把首节中的后继节点对应的线程唤醒,使其再次尝试获取同步状态。

Condition
任意一个Java对象,都拥有一组监视器方法(定义在java.lang.Object上),主要包括wait()、wait(long timeout)、notify()以及notifyAll()方法,使用这些方法的前提是已经获取对象的锁,和 synchronized 配合使用。Condition接口也提供了类似Object的监视器方法,与Lock配合可以实现等待/通知模式。Condition是依赖Lock对象。

Lock lock = new ReentrantLock();Condition condition = lock.newCondition();public void conditionWait() throws InterruptedException {    lock.lock();    try {            condition.await();    } finally {            lock.unlock();    }}public void conditionSignal() throws InterruptedException {    lock.lock();    try {            condition.signal();    } finally {            lock.unlock();    }}

一般将Condition对象作为成员变量。当调用await()方法后,当前线程会释放锁进入等待队列。其他线程调用Condition对象的signal()方法,唤醒等待队列首节点的线程。
实现原理
每个Condition对象都包含着一个等待队列,如果一个线程成功获取了锁之后调用了Condition.await()方法,那么该线程将会释放同步状态、唤醒同步队列中的后继节点,然后构造成节点加入等待队列。只有当线程再次获取Condition相关联的锁之后,才能从await()方法返回。

图片来源:Java并发编程的艺术
在Object的监视器模型上,一个对象拥有一个同步队列和等待队列。Lock通过AQS实现,AQS可以有多个Condition,所以Lock拥有一个同步队列和多个等待队列。

图片来源:Java并发编程的艺术
线程获取了锁之后,调用Condition的signal()方法,会将等待队列的队首节点移到同步队列中,然后该节点的线程会尝试去获取同步状态。成功获取同步状态之后,线程将await()方法返回。

其他
Daemon Thread

在Java中有两类线程:

User Thread(用户线程)
Daemon Thread(守护线程)
只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作。

Daemon的作用是为其他线程的运行提供便利服务,守护线程最典型的应用就是垃圾收集。

将线程转换为守护线程可以通过调用Thread对象的setDaemon(true)方法来实现。
文章来源:https://www.tuicool.com/articles/7nINbeb
作者:博客园

Java并发知识总结,超详细!(下)相关推荐

  1. Java并发编程Future超详细教程

    非原创,自己保存学习用,传播请参考原文. 原文链接:Java并发编程Future超详细教程 前言 创建线程有几种方式?这个问题的答案应该是可以脱口而出的吧 继承 Thread 类实现 Runnable ...

  2. java基础知识总结 超详细

    1,JDK:Java Development Kit,java的开发和运行环境,java的开发工具和jre. 2,JRE:Java Runtime Environment,java程序的运行环境,ja ...

  3. Java并发知识总结,超详细!(上)

    Java并发知识总结,超详细! 首先给大家分享一个github仓库,上面放了 200多本经典的计算机书籍 ,包括C语言.C++.Java.Python.前端.数据库.操作系统.计算机网络.数据结构和算 ...

  4. Java并发知识梳理(上):并发优缺点,线程状态转换,Java内存模型,Synchronized,Volatile,final,并发三特性,Lock与AQS,ReetrandLock

    努力的意义,就是,在以后的日子里,放眼望去全是自己喜欢的人和事! 整个系列文章为Java并发专题,一是自己的兴趣,二是,这部分在实际理解上很有难度,另外在面试过程中也是经常被问到.所以在学习过程中,记 ...

  5. Java 泛型详解(超详细的java泛型方法解析)

    Java 泛型详解(超详细的java泛型方法解析) 1. 什么是泛型 泛型:是一种把明确类型的工作推迟到创建对象或者调用方法的时候才去明确的特殊的类型.也就是说在泛型使用过程中,操作的数据类型被指定为 ...

  6. 深入理解Java虚拟机(第3版)学习笔记——JAVA内存区域(超详细)

    深入理解Java虚拟机(第3版)学习笔记--JAVA内存区域(超详细) 运行时数据区域 程序计数器 java虚拟机栈 本地方法栈 java堆 方法区 运行时常量池 直接内存 对象的创建 对象的内存布局 ...

  7. java cpu利用率上不去_Java 面试突击之 Java 并发知识基础 amp; 进阶考点全解析

    版权说明:本文转自知乎用户木子超,已获其许可,附上其文章主页链接 知乎用户 一.基础 什么是线程和进程? 何为进程? 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的.系统运行一个 ...

  8. 2019年Java大厂面试(吐血超详细总结)

    本文来自于慕课网手记: Java大厂面试(吐血超详细总结) 作者:小码哥的freestyle 链接: https://www.imooc.com/article/286545 来源:慕课网 面试清单 ...

  9. Java改知能机_Java 面试突击之 Java 并发知识基础 进阶考点全解析

    版权说明:本文内容根据 github 开源项目整理所得 项目地址:https://github.com/Snailclimb/JavaGuide​github.com 一.基础 什么是线程和进程? 何 ...

最新文章

  1. 无重复字符的最长子串【哈希算法】-O(n)
  2. Python之值得学习练手的22个迷你程序(附代码)
  3. STM32F103五分钟入门系列(一)跑马灯(库函数+寄存器)+加编程模板+GPIO总结
  4. System V IPC之信号灯
  5. LeetCode 2086. 从房屋收集雨水需要的最少水桶数(贪心)
  6. MySQL—修改数据库root用户密码
  7. SkyEye:航空发动机控制系统仿真
  8. 编译OpenJDK8 arm32的源码库
  9. BZOJ2002[HNOI2010] 弹飞绵羊(LCT)
  10. CSDN社区排名出炉了,来看看你的排名是多少?
  11. ie8兼容性视图灰色修复_【ie8兼容性视图灰色修复】ie8兼容性视图 灰色_ie8兼容性视图设置...
  12. JAVA计算机毕业设计大学生旅游拼团网站Mybatis+源码+数据库+lw文档+系统+调试部署
  13. 需求分析:5W1H分析法
  14. DeR-ViT(CVPR2022)
  15. 超能陆战队:迪士尼画风的漫威英雄
  16. 机器人领域的SCI期刊介绍
  17. 如何用优盘安装服务器操作系统,使用优盘安装服务器
  18. 第一个IOS app- 密码管理大师
  19. 串行通信又称为点对点通信(PtP),其中点对点如何理解
  20. python笔记11 - lambda函数,globals()/locals()函数,eval()exec()函数,闭包函数,函数式编程,高阶函数

热门文章

  1. VAT code VAT NO.
  2. ABAP函数:SD_VBAP_READ_WITH_VBELN(根据销售订单读取表vbap中的信息)
  3. 腾讯“死守”版权,网易云“再强”社区,各筑“孤峰”对战在线音乐下半场
  4. python上传excel文件_flask上传excel文件,无须存储,直接读取内容
  5. linux查看目录文件系统,ubuntu linux 文件系统目录结构-Windows下查看电脑信息的命令-linux菜鸟也必须知道的几个ubuntu最基础命令_169IT.COM...
  6. xml 文本转json java_java将XML文档转换成json格式数据
  7. Python合并2个字典成1个新字典的9种方法
  8. python 中 property 属性的讲解及应用
  9. Python 中函数的 收集参数 机制
  10. Python编码规范:IF中的多行条件