线程数设置原则

在实际工作中,我们需要根据任务类型的不同选择对应的策略。CPU 密集型任务首先,我们来看 CPU 密集型任务,比如加密、解密、压缩、计算等一系列需要大量耗费 CPU 资源的任务。对于这样的任务最佳的线程数为 CPU 核心数的 1~2 倍,如果设置过多的线程数,实际上并不会起到很好的效果。此时假设我们

线程池拒绝策略

线程池拒绝策略时机第一种情况是当我们调用 shutdown 等方法关闭线程池后,即便此时可能线程池内部依然有没执行完的任务正在执行,但是由于线程池已经关闭,此时如果再向线程池内提交任务,就会遭到拒绝。第二种情况是线程池没有能力继续处理新提交的任务,也就是工作已经非常饱和的时候。线程池拒绝策略第一种拒

并发队列 BlockingQueue

BlockingQueue开篇先介绍下 BlockingQueue 这个接口的规则,后面再看其实现。首先,最基本的来说, BlockingQueue 是一个先进先出的队列(Queue),为什么说是阻塞(Blocking)的呢?是因为 BlockingQueue 支持当获取队列元素但是队列为空时,会阻

ThreadLocal笔记

ThreadLocal数组移动的原因在清理无效数据或者遇到相同的entry的key的情况下:遇到的entry是有效的,但是不是在自己原本的位置上,而是被hash冲突所迫而在其他位置上的,则把他们搬去离原本位置最近的后边空槽上。这样在get的时候,会最快找到这个entry,减少开放定址法遍历数组的时间

AQS原理总结

概述Java 中的很多同步类,如 ReentrantLock、CountDownLatch 等都是基于 AbstractQueuedSynchronizer(简称为AQS)实现的。AQS 是一种提供原子式管理同步状态、阻塞和唤醒线程功能以及维护队列模型的抽象框架,用来构建锁或者其他同步组件。本篇文章

Java并发实现原理笔记-多线程基础

线程的优雅关闭stop()与destory()函数线程是一段运行中的代码,或者说是一个运行中的函数。既然是在运行中,就存在一个最基本的问题:运行到一半的线程能否强制杀死?答案是肯定不能。Java中,有stop()、destory()之类的函数,但这些函数都是官方明确不建议使用的。原因很简单,如果强制

Java并发编程实战笔记-基础构建模块

并发容器Java5.0提供了多种并发容器来改进同步容器性能。同步容器将所有对容器状态的访问都串行化,以实现它们的线程安全性。这种方法的代价是严重降低并发性,当多个线程竞争容器的锁时,吞吐量将严重降低。另一方面,并发容器是针对多个线程并发访问设计的。在Java5.0中增加了ConcurrentHash