不知道大家还有没有印象,上次我们已经说过了,我们为了实现集合相关类的线程安全,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的更多相关文章

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

    1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包.这个包包含有一系列能够让 Ja ...

  2. 【死磕Java并发】-----J.U.C之AQS:CLH同步队列

    此篇博客全部源代码均来自JDK 1.8 在上篇博客[死磕Java并发]-–J.U.C之AQS:AQS简单介绍中提到了AQS内部维护着一个FIFO队列,该队列就是CLH同步队列. CLH同步队列是一个F ...

  3. Java 并发工具包 java.util.concurrent 用户指南(转)

    本文转自http://blog.csdn.net/defonds/article/details/44021605/ 感谢作者 1. java.util.concurrent - Java 并发工具包 ...

  4. Java 并发工具包 java.util.concurrent 大全

    1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包.这个包包含有一系列能够让 Ja ...

  5. 1. java.util.concurrent - Java 并发工具包

    1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包.这个包包含有一系列能够让 Ja ...

  6. JAVA并发编程J.U.C学习总结

    前言 学习了一段时间J.U.C,打算做个小结,个人感觉总结还是非常重要,要不然总感觉知识点零零散散的. 有错误也欢迎指正,大家共同进步: 另外,转载请注明链接,写篇文章不容易啊,http://www. ...

  7. 【死磕Java并发】—–J.U.C之AQS(一篇就够了)

    [隐藏目录] 1 独占式 1.1 独占式同步状态获取 1.2 独占式获取响应中断 1.3 独占式超时获取 1.4 独占式同步状态释放 2 共享式 2.1 共享式同步状态获取 2.2 共享式同步状态释放 ...

  8. Java 并发工具包——ExecutorService常用线程池

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

  9. Java 语言特性【一】——JUC(Java 并发工具包)

    引言 JUC即java.util.concurrent,是java提供的用于多线程处理的工具类库.重点关注 ConcurrentXXX.AtomicXXX.Executor.Caller&&a ...

随机推荐

  1. 新建maven项目错误处理

    1.如果新建maven 项目确省maven dependencies,则在存在问题工程的.classpath末尾 加上 <classpathentry kind="con"  ...

  2. Linux基础一:Linux的安装及相关配置

    1. 计算机操作系统简介    1) 操作系统的定义:操作系统是一个用来协调.管理和控制计算机硬件和软件资源的系统程序,它位于硬件和应用程序之间.    2) 操作系统的内核的定义:操作系统的内核是一 ...

  3. Vuex状态管理模式的面试题及答案

    转载:点击查看原文 1.vuex有哪几种属性? 答:有五种,分别是 State. Getter.Mutation .Action. Module 2.vuex的State特性是? 答: 一.Vuex就 ...

  4. jQuery绑定或删除绑定事件

    <!DOCTYPE html><html lang="en" class="loading"><head> <meta ...

  5. python基础复习

    复习-基础 一.review-base 其他语言吗和python的对比 c vs Python c语言是python的底层实现,解释器就是由python编写的. c语言开发的程序执行效率高,开发现率低 ...

  6. 学习REST

    REST:Representational State Transfer,资源的表现状态转换.可以理解为对资源的操作.   1. 资源 资源就是业务对象,如图片.文本.歌曲或者客户.交易等.这些是用户 ...

  7. 51Nod 1264 线段相交(计算几何)

    1264 线段相交  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出平面上两条线段的两个端点,判断这两条线段是否相交(有一个公共点或有部分重合认为相 ...

  8. 16位和32位的80X86汇编语言的区别

    需要注意的是汇编不是一种语言,不同平台有不同的汇编语言对应,因为汇编和操作系统平台相关,所以汇编语言没有移植性.对于IA-32架构平台而言,选用的32位80386汇编语言,也就只说讨论的操作系统平台是 ...

  9. C#学习-类的成员

    定义完类之后,还需在类中定义成员. 类的成员包括字段.属性.方法和构造函数等,它们与类一样,也都有自己的访问权限.以下是 public,同一个程序集或引用该程序集的其他程序集都可以访问 private ...

  10. springboot调用http方式

    1.httpclient 2.okhttp 3.feign 安装Gradle包 compile 'org.springframework.cloud:spring-cloud-starter-open ...