
Java并发
你听___
有点文艺的程序员
展开
-
Java并发总结--校招面经
努力的意义,就是,在以后的日子里,放眼望去全是自己喜欢的人和事!时间总是不知不觉的就溜走了,一晃,学生时代就真的要结束了。前天才吃完了师门的最后的聚餐,痛痛快快的喝了一顿酒。在酒中,对身边的人感恩,也像是自己在对自己的学生时代告别。自己也特别喜欢校园这种简单单纯,让人觉得很青春年轻的感觉,但是,是该开启另一段人生旅程了。从去年结束秋招,但现在忙完毕业论文答辩,这段时间应该算是“...原创 2018-04-15 09:34:54 · 1022 阅读 · 1 评论 -
LockSupport工具
1. LockSupport简介在之前介绍AQS的底层实现,已经在介绍java中的Lock时,比如ReentrantLock,ReentReadWriteLocks,已经在介绍线程间等待/通知机制使用的Condition时都会调用LockSupport.park()方法和LockSupport.unpark()方法。而这个在同步组件的实现中被频繁使用的LockSupport到底是何方神圣,现在...原创 2018-05-06 15:00:36 · 221 阅读 · 0 评论 -
并发容器之ConcurrentHashMap(JDK 1.8版本)
1.ConcurrentHashmap简介在使用HashMap时在多线程情况下扩容会出现CPU接近100%的情况,因为hashmap并不是线程安全的,通常我们可以使用在java体系中古老的hashtable类,该类基本上所有的方法都采用synchronized进行线程安全的控制,可想而知,在高并发的情况下,每次只有一个线程能够获取对象监视器锁,这样的并发性能的确不令人满意。另外一种方式通过Co...原创 2018-05-06 15:15:30 · 219 阅读 · 0 评论 -
并发容器之ConcurrentLinkedQueue
1.ConcurrentLinkedQueue简介在单线程编程中我们会经常用到一些集合类,比如ArrayList,HashMap等,但是这些类都不是线程安全的类。在面试中也经常会有一些考点,比如ArrayList不是线程安全的,Vector是线程安全。而保障Vector线程安全的方式,是非常粗暴的在方法上用synchronized独占锁,将多线程执行变成串行化。要想将ArrayList变成线程...原创 2018-05-06 15:30:41 · 2791 阅读 · 2 评论 -
并发容器之ThreadLocal
1. ThreadLocal的简介2. ThreadLocal的实现原理3. ThreadLocalMap详解3.1 Entry数据结构3.2 set方法3.3 getEntry方法3.4 remove4. ThreadLocal的使用场景1. ThreadLocal的简介在多线程编程中通常解决线程安全的问题我们会利用synchronzed或者lock控制线程对...原创 2018-05-06 15:43:25 · 248 阅读 · 0 评论 -
一篇文章,从源码深入详解ThreadLocal内存泄漏问题
1. 造成内存泄漏的原因?threadLocal是为了解决对象不能被多线程共享访问的问题,通过threadLocal.set方法将对象实例保存在每个线程自己所拥有的threadLocalMap中,这样每个线程使用自己的对象实例,彼此不会影响达到隔离的作用,从而就解决了对象在被共享访问带来线程安全问题。如果将同步机制和threadLocal做一个横向比较的话,同步机制就是通过控制线程访问共享对象...原创 2018-05-06 15:53:18 · 235 阅读 · 0 评论 -
并发容器之CopyOnWriteArrayList
1. CopyOnWriteArrayList的简介java学习者都清楚ArrayList并不是线程安全的,在读线程在读取ArrayList的时候如果有写线程在写数据的时候,基于fast-fail机制,会抛出ConcurrentModificationException异常,也就是说ArrayList并不是一个线程安全的容器,当然您可以用Vector,或者使用Collections的静态方法将...原创 2018-05-06 15:58:52 · 213 阅读 · 0 评论 -
并发容器之BlockingQueue
1. BlockingQueue简介2. 基本操作3. 常用的BlockingQueue1. BlockingQueue简介在实际编程中,会经常使用到JDK中Collection集合框架中的各种容器类如实现List,Map,Queue接口的容器类,但是这些容器类基本上不是线程安全的,除了使用Collections可以将其转换为线程安全的容器,Doug Lea大师为我们都准备了...原创 2018-05-06 16:31:47 · 399 阅读 · 0 评论 -
并发容器之ArrayBlockingQueue和LinkedBlockingQueue实现原理详解
1. ArrayBlockingQueue简介在多线程编程过程中,为了业务解耦和架构设计,经常会使用并发容器用于存储多线程间的共享数据,这样不仅可以保证线程安全,还可以简化各个线程操作。例如在“生产者-消费者”问题中,会使用阻塞队列(BlockingQueue)作为数据容器,关于BlockingQueue可以看这篇文章。为了加深对阻塞队列的理解,唯一的方式是对其实验原理进行理解,这篇文章就主要...原创 2018-05-06 16:35:59 · 478 阅读 · 0 评论 -
详解Condition的await和signal等待/通知机制
1.Condition简介任何一个java对象都天然继承于Object类,在线程间实现通信的往往会应用到Object的几个方法,比如wait(),wait(long timeout),wait(long timeout, int nanos)与notify(),notifyAll()几个方法实现等待/通知机制,同样的, 在java Lock体系下依然会有同样的方法实现等待/通知机制。从整体上来...原创 2018-05-06 14:54:40 · 17669 阅读 · 6 评论 -
彻底理解ReentrantLock
1. ReentrantLock的介绍ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不会被阻塞。在java关键字synchronized隐式支持重入性(关于synchronized可以看这篇文章),synchronized通过获取自增,释放自减的方式实现重入。与此同时,R...原创 2018-05-03 21:13:19 · 13923 阅读 · 6 评论 -
深入理解AbstractQueuedSynchronizer(AQS)
1. AQS简介在上一篇文章中我们对lock和AbstractQueuedSynchronizer(AQS)有了初步的认识。在同步组件的实现中,AQS是核心部分,同步组件的实现者通过使用AQS提供的模板方法实现同步组件语义,AQS则实现了对同步状态的管理,以及对阻塞线程进行排队,等待通知等等一些底层的实现处理。AQS的核心也包括了这些方面:同步队列,独占式锁的获取和释放,共享锁的获取和释放以及...原创 2018-05-03 21:01:39 · 188 阅读 · 0 评论 -
并发编程的优缺点
一直以来并发编程对于刚入行的小白来说总是觉得高深莫测,于是乎,就诞生了想写点东西记录下,以提升理解和堆并发编程的认知。为什么需要用的并发?凡事总有好坏两面,之间的trade-off是什么,也就是说并发编程具有哪些缺点?以及在进行并发编程时应该了解和掌握的概念是什么?这篇文章主要以这三个问题来谈一谈。1. 为什么要用到并发一直以来,硬件的发展极其迅速,也有一个很著名的”摩尔定律”,可能会...原创 2018-04-30 15:31:52 · 3567 阅读 · 0 评论 -
线程状态转换以及基本操作
在上一篇文章中并发编程的优缺点谈到了为什么花功夫去学习并发编程的技术,也就是说我们必须了解到并发编程的优缺点,我们在什么情况下可以去考虑开启多个线程去实现我们的业务,当然使用多线程我们应该着重注意一些什么,在上一篇文章中会有一些讨论。那么,说了这么多,无论是针对面试还是实际工作中作为一名软件开发人员都应该具备这样的技能。万事开头难,接下来就应该了解如何新建一个线程?线程状态是怎样转换的?关于线程状...原创 2018-04-30 16:08:56 · 454 阅读 · 0 评论 -
彻底理解synchronzied
1. synchronized简介2. synchronized实现原理2.1 对象锁(monitor)机制2.2 synchronized的happens-before关系2.3 锁获取和锁释放的内存语义3. synchronized优化3.1 CAS操作3.1.1 什么是CAS?3.1.2 CAS的操作过程3.1.3 CAS的应用场景3.1.4 CAS的问题3...原创 2018-04-30 17:35:01 · 468 阅读 · 0 评论 -
彻底理解volatile
1. volatile简介在上一篇文章中我们深入理解了java关键字synchronized,我们知道在java中还有一大神器就是关键volatile,可以说是和synchronized各领风骚,其中奥妙,我们来共同探讨下。通过上一篇的文章我们了解到synchronized是阻塞式同步,在线程竞争激烈的情况下会升级为重量级锁。而volatile就可以说是java虚拟机提供的最轻量级的同步机...原创 2018-05-02 20:53:55 · 178 阅读 · 0 评论 -
你以为你真的了解final吗?
1. final的简介2. final的具体使用场景2.1 变量2.1.1 final成员变量2.2.2 final局部变量2.2 方法2.3 类3. final的例子4. 多线程中你真的了解final吗?4.1 final域重排序规则4.1.1 final域为基本类型4.1.2 final域为引用类型5.final的实现原理6. 为什么final引用...原创 2018-05-02 21:11:00 · 37548 阅读 · 3 评论 -
深入理解读写锁ReentrantReadWriteLock
1.读写锁的介绍在并发场景中用于解决线程安全的问题,我们几乎会高频率的使用到独占式锁,通常使用java提供的关键字synchronized(关于synchronized可以看这篇文章)或者concurrents包中实现了Lock接口的ReentrantLock。它们都是独占式获取锁,也就是在同一时刻只有一个线程能够获取锁。而在一些业务场景中,大部分只是读数据,写数据很少,如果仅仅是读数据的话并...原创 2018-05-03 21:28:10 · 302 阅读 · 3 评论 -
三大性质总结:原子性、可见性以及有序性
1. 三大性质简介在并发编程中分析线程安全的问题时往往需要切入点,那就是两大核心:JMM抽象内存模型以及happens-before规则(在这篇文章中已经经过了),三条性质:原子性,有序性和可见性。关于synchronized和volatile已经讨论过了,就想着将并发编程中这两大神器在 原子性,有序性和可见性上做一个比较,当然这也是面试中的高频考点,值得注意。2. 原子性原子性是...原创 2018-05-03 20:38:44 · 5487 阅读 · 1 评论 -
初识Lock与AbstractQueuedSynchronizer(AQS)
1. concurrent包的结构层次在针对并发编程中,Doug Lea大师为我们提供了大量实用,高性能的工具类,针对这些代码进行研究会让我们队并发编程的掌握更加透彻也会大大提升我们队并发编程技术的热爱。这些代码在java.util.concurrent包下。如下图,即为concurrent包的目录结构图。其中包含了两个子包:atomic以及lock,另外在concurrent下的阻塞...原创 2018-05-03 20:50:49 · 393 阅读 · 0 评论 -
【Java并发专题】27篇文章详细总结Java并发基础知识
努力的意义,就是,在以后的日子里,放眼望去全是自己喜欢的人和事!github:https://github.com/CL0610/Java-concurrency,欢迎题issue和Pull request。所有的文档都是自己亲自码的,如果觉得不错,欢迎给star鼓励支持 :)整个系列文章为Java并发专题,一是自己的兴趣,二是,这部分在实际理解上很有难度,另外在面试过程中也是经常...原创 2018-05-07 19:16:00 · 1395 阅读 · 1 评论