Java并发包的理解
Java并发包的理解
- 并发包相对于Synchronize的优势
- AQS理解
- AQS实现自定义锁的要点
- 并发包同步队列底层总结
- 并发包对wait、notify机制的优化:
- 参考
并发包相对于Synchronize的优势
并发包相对于synchronize而言,
功能性上:提供了获取与释放锁的可操作性。支持非阻塞式、可中断以及超时获取锁的机制。
性能上:使用volatile与CAS是种乐观锁的思想,避免直接使用重量级的锁,避免了多个线程被迫串行以及上下文切换过程,提高了并发性能。
缺陷:只适用于单机版本,无法适用于多机服务。
AQS理解
并发包提供的各种锁比如可重入锁、读写锁等的底层是通过AQS实现的。
AQS解决了实现锁时涉及当的大量细节问题,例如获取锁的同步状态(通过volatile变量 + CAS操作实现)、维护了与synchronize对等的两个队列(锁池队列以及等待队列(多个等待队列)),并且支持公平锁与非公平锁的机制。AQS底层是volatile以及CAS,这里处理了CAS操作的大量细节,比如队列状态维护,线程休眠时间控制等。
基于AQS来构建同步器可以带来很多好处。它不仅能够极大地减少实现工作,而且也不必处理在多个位置上发生的竞争问题。
AQS具体介绍:《并发编程的艺术》p121
AQS实现自定义锁的要点
实现的核心点:
- get、set、compareAndSetState接口获取以及设置锁的同步状态Volatile state变量。
- 提供tryAcquire、tryRelease、tryAcquireShared、tryReleaseShared等接口,具体实现独占锁以及共享锁
提供acquire、acquired等模板方法,这些模板方法分为三类:独占式获取与释放、共享式获取与释放、查询同步队列情况等方法。方便直接调用
这里就是一种模板模式,abstract抽象类,提供了抽象方法让用户去自己实现从而定义自己的锁。
并发包同步队列底层总结
同步队列的核心点:
head、tail是volatile保持可见性与有序性,通过compareAndSetTail与casHead保证操作的原子性
添加节点的时候是自旋操作,不涉及任何的线程休眠
在AQS提供的acquire方法中,
添加到同步队列之后,node等待成为头结点的后继节点之后,尝试casState,一旦成功即为获取到锁,此时将自己更新为头结点
如果非头节点,则会使用lockSupport让当前线程休眠,退出时间片的竞争。
在release方法中,会去唤醒同步队列head节点的一个节点,唤醒休眠态的节点。
这里自旋会首先判断自己是否是头结点,原因:维持FIFO、防止伪唤醒迅速判定状态然后继续休眠。
公平与否的实现就是看是否要做头结点的判断,如果不公平,则是直接去tryAcquire。
关于共享锁的实现,与独占锁之间的区别就在于volatile state的不同,独占锁是0,1,共享锁是比1大的数字,从而支持重入,支持读写分离。
在state为0的时候意味着没有任何线程获取到锁,非0的时候意味着有线程获取到锁,然后进行后续判断与处理即可,比如可重入的话就判断线程是否相同。
读写锁则是利用了int的高低位之间的区别,从而完成读写状态的判断。
并发包对wait、notify机制的优化:
之前的object的wait-notify机制,只支持一个object.wait
lock可以设置多个等待队列,new 多个condition即可。
阻塞队列:
常用于生产者消费者模式
参考
AQS介绍:
https://juejin.im/entry/5ae02a7c6fb9a07ac76e7b70
LinkedBlockingQueue源码分析与api介绍:
https://blog.csdn.net/tonywu1992/article/details/83419448
https://blog.csdn.net/weixin_41771218/article/details/83056052
Java并发包的理解相关推荐
- 腾讯面试题Java 并发包之线程池综述
Java 并发包之线程池综述 ■ 线程池的创建 在Java中,您可以通过调整-Xss参数来调节每个线程栈的大小(64bit系统默认1024KB),当减小该值时意味着可以创建更多的线程数,但问题是JVM ...
- java并发包系列---LockSupport
长久以来对线程阻塞与唤醒经常我们会使用object的wait和notify,除了这种方式,java并发包还提供了另外一种方式对线程进行挂起和恢复,它就是并发包子包locks提供的LockSupport ...
- 深入java并发包源码(三)AQS独占方法源码分析
深入java并发包源码(一)简介 深入java并发包源码(二)AQS的介绍与使用 深入java并发包源码(三)AQS独占方法源码分析 AQS 的实现原理 学完用 AQS 自定义一个锁以后,我们可以来看 ...
- Java并发包基石-AQS详解
目录 1 基本实现原理 1.1 如何使用 1.2 设计思想 2 自定义同步器 2.1 同步器代码实现 2.2 同步器代码测试 3 源码分析 3.1 Node结点 3.2 独占式 3.3 共享式 4 总 ...
- java并发包详解(jdk7)
在此对java并发包做一个大致总结,如有错误,请指正. juc包的总体结构大致如下 外层框架主要有Lock(ReentrantLock.ReadWriteLock等).同步器(semaphores等) ...
- Java并发编程初级-未使用Java并发包的时候
转自Java并发编程网 http://ifeve.com/java_multi_thread_programming_1_2/ 本文介绍了Java原生的多线程技术(1.2),通过详细介绍wait和 ...
- Java多线程并发编程--Java并发包(JUC)
Java多线程并发–Java并发包(JUC) 前言 前一篇文章中,笔者已经介绍了Java多线程的一些基础知识,但是想要成为一名中高级Java程序员还必须懂得Java并发包(JUC)的知识点,而且JUC ...
- Java并发包下的辅助工具类
Java并发包下为我们提供了一些辅助工具类,来简单看看如何使用 一.CountDownLatch 减法器,必须等到减法器的值为0了,才能继续往下执行.也可以将它理解为栅栏 让一些线程堵塞直到另一个线程 ...
- JUC第一讲:juc并发包深入理解(P6熟练 P7精通)
并发编程并不是 Java 特有的语言特性,它是一个通用且早已成熟的领域.Java 只是根据自身情况做了实现罢了.并发编程可以总结为三个核心问题:分工.同步.互斥.分工指的是如何高效地拆解任务并分配给线 ...
- Java中 多态的理解
** Java中 多态的理解 ** 多态官方定义为: 所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指 ...
最新文章
- poj 2503(字符串hash)
- 【Java】switch 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String 上
- 时间选择器 可以选择日期和时间
- Doc2Bow简介与实践Demo
- WPF:从WPF Diagram Designer Part 1学习控件模板、移动、改变大小和旋转
- Linux运维-day3
- System Center Configuration Manager 2016 域准备篇(Part2)
- 网站被黑检测-网页挂马及暗链检测
- R软件中调用windows字体二
- VS2010 SP1安装失败之”此计算机的状态不支持此安装“
- css磨砂效果背景和特殊背景
- Linux网络容灾,关于异地容灾的感触
- 阿里云同步gcr.io的镜像
- android三星定位闪退,三星手机闪退问题7种修复方法
- 什么是RISC-V生态系统?
- 如何判断THIS指向?
- 查看MySQL数据库的命令
- 用计算机制作动画,什么是计算机动画制作
- 树莓派4上手(无显示屏)
- From tomorrow
热门文章
- mysqli 语句和mysql语句一样吗_mysqli语句的用法
- SpringMVC中解决POST和GET请求中文乱码问题
- stm32f103c8t6开发版点亮oled屏幕工程文件_OLED液晶屏如何显示中文呢
- c语言产品信息管理课程设计,商品信息管理系统(C语言课程设计).doc
- C++11中智能指针的原理、使用、实现
- IMP-00058: 遇到 ORACLE 错误 1017 导入时登录失败
- 开源数据库学习资料汇总
- 车牌识别用php算法,车牌识别算法实现及其代码实现之一:车牌区域检测
- nc加载不了java,用友NC系统使用过程中常见问题和解决方法
- c语言学习视频(学c语言看谁的视频)