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 ...
随机推荐
- Guideline 5.2.1 - Legal - Intellectual Property 解决方案
最近在上架公司公司项目的时候遇到这个问题什么5.2.1 然后去了解发现最近不少人都遇到了这个问题.先说一下 我上架的APP是一个医疗的APP然后说需要什么医疗资质,估计是账号的公司资质不够吧.后面和苹 ...
- web的分页方法
web分页的三种方式,闲来无事总结一下. 1.使用前端表格插件进行分页 例如用bootstrap的拓展table组件,注意设置其分页属性时设置为"client", 即是 sideP ...
- Ionic3.0 输入状态时隐藏Tabs栏
刚接触ionic3 不久 ,发现遍地都是坑,昨天遇到一个问题就是当键盘弹起的时候tabs 也被 弹了起来,最初预想是放在tabs 的一个子页面内处理这个问题, Tabs隐藏后,我们发现底部有部分空白, ...
- LeetCode(79): 单词搜索
Medium! 题目描述: 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格.同一个单元 ...
- 【python】多进程共享变量
有一个字典变量,需要在多个进程间共享 使用Manager, 下面是一个小例子. 注意使用json前需要将类型转换. #!/usr/bin/python # coding=utf-8 import js ...
- Shiro+Redis实现tomcat集群session共享
一.背景 当我们使用了nginx做项目集群以后,就会出现一个很严重的问题亟待解决,那就是:tomcat集群之间如何实现session共享的问题,如果这个问题不解决,就会出现登陆过后再次请求资源依旧 ...
- JS判断元素 动画是否执行完成
使用animationend方法 var ele = document.getElementById("box"); ele.addEventListener("anim ...
- tomcat和server安装和操作
servers的创建 最后一步:ctrl+s
- C. cltt的幸运数LCAtarjan
/*C: cltt的幸运数 Time Limit: 1 s Memory Limit: 128 MB Submit Problem Description 一棵树有n个节点,共m次查询,查询 ...
- SQL Server 对字符进行排序(数字类的字符)
使用的是SQLserver数据库测试,其他数据库类似. 默认排序是按ID进行排序的 select stu_id ,stu_name from student order by stu_id. 现在需要 ...