Java 并发工具包 | J.U.C
不知道大家还有没有印象,上次我们已经说过了,我们为了实现集合相关类的线程安全,JDK 提供了一套同步容器,也就是 Vector,Hashtable,还有一个 Collections 工具类中的几个方法。
问题是什么呢,同步容器并不能保证线程安全,我在们写代码的时候还需要注意一些方法的使用,在 JDK 1.5 及以后就出现了 java.util.current 包,这个包中就提供了大量的类来实现线程安全,这也就是我们经常说的 JUC。
举例例子吧,与 HashMap 对应的线程安全的容器,ConcurrentHashMap 就是出自这个包。
稍微整理了一下这个包中都包含了哪些功能,做个思维导图。

不得不说,这其中的知识点非常多,我这只是列出了一部分,作为大纲,我呢也不可能都说,用到的类也很少,目前工作基本接触不到这些类的使用。
但是吧,我还是强烈建议有基础的同学看看源码,膜拜一下大神。
我就简单说几个面试常问的,并发容器,atomic 包,Lock 和其实现类,线程池。
并发容器最最常问的就是 ConcurrentHashMap 的原理,四个字分段加锁。使用的是 synchronized 代码块加锁,只不过锁的范围不再是整个 table ,而是一个一个的 Node。
原子包中的原子类主要就是提供了一些不需要加锁就能保证原子性操作的一些方法,我们不使用锁进行同步,而是使用算法来保证操作的原子性,主要涉及的算法是 CAS,核心方法就是 compareAndSwap。这个方法是实现是 native 的,嗯,不是 Java 实现的。
算法思想就是我拿工作内存中的值和主存中的值进行比较,若是一样我才操作,不一样那就修改主存中的值,继续比较直到满足条件。这样做也就保证了主内存和工作内存中的值一致。
有个有趣的事情,CAS 是定义在一个 Unsafe 类中的。有么有想过,尽然还有这么有意思的类名,原来这个类是由 sun 公司提供的,之所以命名为 Unsafe 是因为 GC 的时候不能回收这个类,所以官方不建议使用。
嗯,在 CAS 算法中还有可能出现 ABA 问题,就是说在读取内存中变量的时候看起来没有变化,可能是已经又变回来了,解决的方法就是每次修改变量的时候都会加上一个版本号,同时比较版本号和变量的值是否改变。
ReentrantLock 名为可重入锁,就是说一个线程在获得一个锁之后,再次获取该锁时,不需要重新等待获取。ReentrantLock 又分为公平锁和非公平锁,公平锁指的是严格按照先来先得的顺序排队等待去获取锁,而非公平锁每次获取锁时,是先直接尝试获取锁,获取不到,再按照先来先得的顺序排队等待。
ReentrantReadWriteLock 可重入读写锁,指的是没有线程进行写操作时,多个线程可同时进行读操作,当有线程进行写操作时,其它读写操作只能等待。可以多线程一起读但是一旦有写就需要等着,有较好的并发行和吞吐量。
线程频繁的创建和销毁是很浪费资源的,所以我们就创建一个线程池用来保证有一部分线程始终处于待命状态,来任务了可以立马执行,这也是线程池的优点,提高资源的利用率,提高了请求响应的速度,而且我们还可以管理已经创建的线程。
线程池主要关注点在线程池创建的 7 个参数上,我们并发量很小的时候,待命的线程过多也是浪费大量的资源,所以关于性能调优,这些没有定论,要根据自身的业务场景。
参数主要是线程池的大小,最大线程数,设置空闲时间,线程过多时使用何种阻塞队列,创建线程的工厂是什么,当阻塞队列也满了时,采用什么策略来处理后续线程。
东西真的好多,我这只是说了一丢丢,好多东西我只是知道但是没有用过,我是感觉脱离业务的技术意义不大,虽然学起来感觉很牛逼,但是用不到的我也就止步于此了,大家加油,至少拓展了我们的思路,再接触时不会怂!
Java 并发工具包 | J.U.C的更多相关文章
- Java 并发工具包 java.util.concurrent 用户指南
1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包.这个包包含有一系列能够让 Ja ...
- 【死磕Java并发】-----J.U.C之AQS:CLH同步队列
此篇博客全部源代码均来自JDK 1.8 在上篇博客[死磕Java并发]-–J.U.C之AQS:AQS简单介绍中提到了AQS内部维护着一个FIFO队列,该队列就是CLH同步队列. CLH同步队列是一个F ...
- Java 并发工具包 java.util.concurrent 用户指南(转)
本文转自http://blog.csdn.net/defonds/article/details/44021605/ 感谢作者 1. java.util.concurrent - Java 并发工具包 ...
- Java 并发工具包 java.util.concurrent 大全
1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包.这个包包含有一系列能够让 Ja ...
- 1. java.util.concurrent - Java 并发工具包
1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包.这个包包含有一系列能够让 Ja ...
- JAVA并发编程J.U.C学习总结
前言 学习了一段时间J.U.C,打算做个小结,个人感觉总结还是非常重要,要不然总感觉知识点零零散散的. 有错误也欢迎指正,大家共同进步: 另外,转载请注明链接,写篇文章不容易啊,http://www. ...
- 【死磕Java并发】—–J.U.C之AQS(一篇就够了)
[隐藏目录] 1 独占式 1.1 独占式同步状态获取 1.2 独占式获取响应中断 1.3 独占式超时获取 1.4 独占式同步状态释放 2 共享式 2.1 共享式同步状态获取 2.2 共享式同步状态释放 ...
- Java 并发工具包——ExecutorService常用线程池
1. 执行器服务 ExecutorService java.util.concurrent.ExecutorService 接口表示一个异步执行机制,使我们能够在后台执行任务.因此一个 Executo ...
- Java 语言特性【一】——JUC(Java 并发工具包)
引言 JUC即java.util.concurrent,是java提供的用于多线程处理的工具类库.重点关注 ConcurrentXXX.AtomicXXX.Executor.Caller&&a ...
随机推荐
- ios蓝牙详解
最近这段时间在研究蓝牙,也研究了一段时间了现在在下面做个总结 1 其实蓝牙连接只要明白了整体原理,其实挺简单的 2 大部分情况下,手机作为中心管理者,而连接的设备被称为外设,外设的结构有点像一颗大树 ...
- Android UiAutomator - CTS Frame
使用UiAutomator进行UI自动化测试后,生成的测试结果并不是很美观.为了生成一份好看的测试结果(报告),本文将使用CTS框架,当然也可以自己编写一份测试报告框架(如:生成html,excel报 ...
- http超文本协议
当今web程序的开发技术真是百家争鸣,ASP.NET, PHP, JSP,Perl, AJAX 等等. 无论Web技术在未来如何发展,理解Web程序之间通信的基本协议相当重要, 因为它让我们理解了We ...
- BeautifulSoup的基本操作
>>> from bs4 import BeautifulSoup #导入 >>> soup = BeautifulSoup(url.content," ...
- dbcp连接池出现的问题java.lang.AbstractMethodError: com.mysql.jdbc.Connection.isValid(I)Z
解决方案:mysql-connector 版本为 5.0.4 ,那么对应的 dbcp 和 pool 版本应该为 1.4 和 1.6 . 5.0.4 不应该使用 2.0 及以上版本的 dbcp 和 ...
- 第七周学习总结-C#
2018年8月26日 这个周二突然得知另一位老师留的暑假作业,群文件里早就上传了,我居然一直没翻到那里,要不是同学问作业做完没,我可能开学就要“真●裸考”了
- 原创 《算法》java第四版,标准输入
<算法>学习过程中,在eclipse里调试时,对于官方提供的源码中标准输入的操作,没有搞懂 自己改了一下,直接读取本地测试数据测试数据可在http://algs4.cs.princet ...
- python unittest套件,修改为失败重新执行
#套件,修改为失败重新执行 import time import unittest from unittest.suite import _isnotsuite class Suit(unittest ...
- 集腋成裘-03-css基础-02
1.1 三种写法 内嵌式:样式只作用于当前文件,没有真正实现结构表现分离 外链式:作用范围是当前站点,真正实现了内容与表现分离 行内样式:仅限于当前标签,结构混在一起 1.2 标签分类 1.2.1 块 ...
- linux基础练习题(1)
Linux命令作业(关卡一) 练习题1 理解操作系统的作用,以及各种操作系统的不同 要求: 简述什么是OS 简述应用程序.硬件.OS的关系 列举出3种常见的操作系统 简述Ubuntu和Linux的关系 ...