摘要: 引言 在日常开发中,线程池是使用非常频繁的一种技术,无论是服务端多线程接收用户请求,还是客户端多线程处理数据,都会用到线程池技术,那么全面的了解线程池的使用、背后的实现原理以及合理的优化线程池的大小等都是非常有必要的。这篇文章会通过对一系列的问题的解答来讲解线程池的基本功能以及背后的原理,希望能对 阅读全文
posted @ 2020-11-28 15:24 looyee 阅读(183) 评论(0) 推荐(0) 编辑
摘要: 引言 JDK中除了上文提到的各种并发容器,还提供了丰富的阻塞队列。阻塞队列统一实现了BlockingQueue接口,BlockingQueue接口在java.util包Queue接口的基础上提供了put(e)以及take()两个阻塞方法。他的主要使用场景就是多线程下的生产者消费者模式,生产者线 阅读全文
posted @ 2020-11-28 15:23 looyee 阅读(138) 评论(0) 推荐(0) 编辑
摘要: 引言 容器是Java基础类库中使用频率最高的一部分,Java集合包中提供了大量的容器类来帮组我们简化开发,我前面的文章中对Java集合包中的关键容器进行过一个系列的分析,但这些集合类都是非线程安全的,即在多线程的环境下,都需要其他额外的手段来保证数据的正确性,最简单的就是通过synchronized 阅读全文
posted @ 2020-11-28 15:22 looyee 阅读(64) 评论(0) 推荐(0) 编辑
摘要: 在上一篇《你真的懂ReentrantReadWriteLock吗?》中我给大家留了一个引子,一个更高效同时可以避免写饥饿的读写锁 StampedLock。StampedLock实现了不仅多个读不互相阻塞,同时在读操作时不会阻塞写操作。 为什么StampedLock这么神奇?能够达到这种效果,它的核心 阅读全文
posted @ 2020-11-28 15:21 looyee 阅读(127) 评论(0) 推荐(0) 编辑
摘要: 引言 在前几篇文章中了解了ReentrantLock、Semaphore与CountDownLatch后,J.U.C包中基于AQS实现的并发工具类还剩一个比较重要的:读写锁ReentrantReadWriteLock。读写锁在Java面试过程中是一个经常性考的题目,他涉及到的知识点比较多,导致很多人 阅读全文
posted @ 2020-11-28 15:20 looyee 阅读(66) 评论(0) 推荐(0) 编辑
摘要: 引言 上一篇文章中详细分析了基于AQS的ReentrantLock原理,ReentrantLock通过AQS中的state变量0和1之间的转换代表了独占锁。那么可以思考一下,当state变量大于1时代表了什么?J.U.C中是否有基于AQS的这种实现呢?如果有,那他们都是怎么实现的呢?这些疑问通过详细 阅读全文
posted @ 2020-11-28 15:19 looyee 阅读(61) 评论(0) 推荐(0) 编辑
摘要: 引言 在synchronized未优化之前,我们在编码中使用最多的同步工具类应该是ReentrantLock类,ReentrantLock拥有优化后synchronized关键字的性能,又提供了更多的灵活性。相比synchronized,他在功能上更加强大,具有等待可中断,公平锁以及绑定多个条件等s 阅读全文
posted @ 2020-11-28 15:18 looyee 阅读(52) 评论(0) 推荐(0) 编辑
摘要: 引言 上一篇文章中我们说过,volatile通过lock指令保证了可见性、有序性以及“部分”原子性。但在大部分并发问题中,都需要保证操作的原子性,volatile并不具有该功能,这时就需要通过其他手段来达到线程安全的目的,在Java编程中,我们可以通过锁、synchronized关键字,以及CAS操 阅读全文
posted @ 2020-11-28 15:17 looyee 阅读(142) 评论(0) 推荐(0) 编辑
摘要: 引言 谈到volatile关键字,大多数开发者都有一定了解,可以说是开发者非常熟悉,深入之后又非常陌生的一个关键字。相当于轻量的synchronized,也叫轻量级锁,与synchronized相比性能上开销较少,同时又具备了可见性、有序性以及部分原子性,是Java并发需中非常重要的一个关键字。这篇 阅读全文
posted @ 2020-11-28 15:16 looyee 阅读(64) 评论(0) 推荐(0) 编辑
摘要: 引言 上一篇文章聊到了Java内存模型,在其中我们说JMM是建立在happens-before(先行发生)原则之上的。为什么这么说呢?因为在Java程序的执行过程中,编译器和处理器对我们所写的代码进行了一系列的优化来提高程序的执行效率。这其中就包括对指令的“重排序”。重排序导致了我们代码并不会按照代 阅读全文
posted @ 2020-11-28 15:14 looyee 阅读(96) 评论(0) 推荐(0) 编辑
摘要: 引言 在计算机系统的发展过程中,由于CPU的运算速度和计算机存储速度之间巨大的差距。为了解决CPU的运算速度和计算机存储速度之间巨大的差距,设计人员在CPU和计算机存储之间加入了高速缓存来做为他们之间的桥梁,在运算时,先将数据拷贝到高速缓存中,计算完成后再将结果写入计算机存储,这样大大提高了计算效率 阅读全文
posted @ 2020-11-28 15:13 looyee 阅读(68) 评论(0) 推荐(0) 编辑
摘要: 一、锁机制 常用的锁机制有两种: 1、悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。悲观锁的实现,往往依靠底层提供的锁机制;悲观锁会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。 2、乐观锁:假设不会发生并发冲突,每次不加锁而是假设没有冲突而去完成某项操作,只在提交操作时检查 阅读全文
posted @ 2020-11-28 09:44 looyee 阅读(999) 评论(0) 推荐(0) 编辑