![](https://img-blog.csdnimg.cn/20190918140012416.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java并发编程
文章平均质量分 77
并发编程
大唐雨夜
这个作者很懒,什么都没留下…
展开
-
【Future】Future和Callable的运用
Runnable接口没有返回值,并且不能抛出已检查异常,只能捕获。原创 2021-03-10 07:55:00 · 215 阅读 · 0 评论 -
【并发流程】使用工具类控制并发流程
【并发流程】使用工具类控制并发流程原创 2021-03-07 09:20:18 · 281 阅读 · 1 评论 -
【并发容器】4 阻塞/非阻塞队列的介绍与选择
阻塞队列是具有阻塞功能的队列,通常一端放入生产者数据,另一端供消费者消费数据。==阻塞队列是线程安全的。==原创 2021-03-03 07:44:26 · 561 阅读 · 3 评论 -
【并发容器】3 CopyOnWriteArrayList
CopyOnWriteArrayList设计理念是,读取完全不加锁,并且写入时不会阻塞读取操作,只有写写才需要同步等待。原创 2021-03-01 23:57:15 · 244 阅读 · 2 评论 -
【并发容器】2 ConnrentHashMap
ConcurrentHashMap的实现原理原创 2021-03-01 23:55:03 · 256 阅读 · 0 评论 -
【Atomic】原子类小结
原子类,可以保证并发情况下线程安全。对于锁具有两点优势:- 粒度更细:将竞争范围缩小到变量级别,是最小粒度。锁粒度通常大于原子类。- 效率更高:通常效率高于锁,在高度竞争的情况下不如锁。【原因在后面】原创 2021-02-24 08:00:02 · 541 阅读 · 0 评论 -
【CAS】CAS原理
CAS是所有原子类的底层原理,乐观锁主要采用CAS算法。CAS,比较并交换,是==JDK提供的非阻塞原子性操作,通过硬件保证比较-更新操作的原子性。== 通常结合volatile保证共享变量的原子性。原创 2021-02-24 07:55:46 · 3090 阅读 · 0 评论 -
【锁】2 最全的锁分类
锁的分类,是从不同角度上看的。一种锁可以有多种属性,例如ReentrantLock既是独占锁,又是可重入锁。原创 2021-02-22 23:53:23 · 2512 阅读 · 0 评论 -
【锁】1 Lock的优势与特性
Lock和synchronized是最常见的锁,用于控制对共享资源的访问。Lock不是用来代替synchronized的,而是synchronized不满足要求时,提供更高级的功能。Lock接口常见实现类是ReentrantLock和ReadWriteLock。原创 2021-02-22 08:08:23 · 6287 阅读 · 9 评论 -
【ThreadLocal】ThreadLocal实际开发中的注意点
ThreadLocal内存泄漏内存泄漏:对象不再使用,但是仍然驻留在内存中。ThreadLocalMap中Entry的结构static class Entry extends WeakReference<ThreadLocal<?>> { Object value; // ThreadLocal变量值 Entry(ThreadLocal<?&...原创 2020-03-30 23:23:00 · 212 阅读 · 0 评论 -
【ThreadLocal】ThreadLocal使用场景及示例
ThreadLocal是线程封闭的重要措施,Spring中DateTimeContextHolder和RequestContextHolder也有用到。ThreadLocal的使用场景场景1:对象隔离–线程需要一个独享的对象(例如SimpleDateFormat)线程独享一个对象工具类,例如Random、DateFormat,通常出于线程安全、提高效率两方面的考虑。对于线程独享对象场景,主...原创 2020-03-30 23:11:02 · 748 阅读 · 0 评论 -
【线程池】 正确创建线程池的方法
正确创建线程池的方法线程池可以通过Executors工具类自动创建,也可以手动创建。对于如何选择,《Java开发手册》有如下描述:线程池不允许使用Executors创建,而是通过ThreadPoolExecutor方式。这样可以使开发人员更加明确线程池的运行规则,规避资源耗尽的风险。Executros生成线程池对象的弊端:FixedThreadPool和SingleThreadPoo...原创 2020-03-28 09:43:02 · 1917 阅读 · 0 评论 -
【线程池】ThreadPoolExecutor结构以及构造器参数详解
线程池的介绍不用线程池存在的问题反复创建销毁线程开销大过多的线程占用大量内存线程池的使用,就类似于计划经济,控制资源总量,复用线程。有如下3点好处。加快响应速度。消除了线程创建带来的延时。合理的利用CPU和内存。控制线程的数量,既不会因为线程太多导致内存溢出,也不会因为太少导致CPU资源的浪费。便于统一管理线程。例如数据统计。线程的使用场景举例:服务器接收大量请求,使用...原创 2020-03-28 09:36:09 · 1230 阅读 · 0 评论 -
【线程池】重要方法底层原理解读
分析线程池的底层原理,有问题烦请批评指正。execute()方法提交任务command到线程池执行。public void execute(Runnable command) { // 0. 如果任务为空,抛出NPE if (command == null) throw new NullPointerException(); // 获取ctl属性...原创 2020-03-28 08:44:21 · 631 阅读 · 0 评论 -
【线程池】线程池的钩子方法与使用示例
在每个任务执行前后使用钩子方法可以实现一些线程池辅助功能,例如线程池的暂停与恢复、打印日志、统计等。ThreadPoolExecutor提供了3个钩子方法,需要子类根据需要重写方法。对于三个钩子方法的使用,参见runWoker方法和tryTerminate方法。protected void beforeExecute(Thread t, Runnable r) { } // 任务执行前p...原创 2020-03-28 08:32:20 · 1301 阅读 · 0 评论 -
【线程池】线程池的重要属性与状态切换
线程池状态和工作线程数–ctlctl属性的设计原理ctl属性是一个Integer原子变量,用于记录线程状态和线程池中线程数量。Integer变量的高3位记录线程状态,剩余位记录线程池线程个数。// ctl属性:默认为RUNNINGprivate final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));private s...原创 2020-03-28 00:03:30 · 476 阅读 · 0 评论 -
【线程内参】启动线程
启动Java线程public class StartAndRunMethod { public static void main(String[] args) { Runnable task = () -> { System.out.println(Thread.currentThread().getName()); }; ...原创 2020-03-21 13:30:40 · 164 阅读 · 0 评论 -
【活跃性问题】全面分析死锁、活锁和饥饿
描述:当两个或者多个线程(或者进程)互相持有对方所占有的资源,又不主动释放自己的资源,导致线程陷入阻塞,即为死锁。多个线程如果存在环形的锁依赖关系,可能导致死锁。原创 2020-03-07 23:22:08 · 1025 阅读 · 0 评论 -
【线程内参】Java创建多线程的方式到底有几种?
线程创建Java并发方面有很多书籍以及博客,针对于线程创建方式有着不同描述,例如实现Runnable接口、集成Thread类、使用线程池工具类以及结合Callable和Future创建线程等。线程创建的两种方式Oracle官方文档,即java.lang.Thread类注释的表述是有如下两种创建线程的方式。https://docs.oracle.com/javase/8/docs/api/in...原创 2020-01-30 20:55:18 · 1444 阅读 · 1 评论 -
ThreadLocal#ThreadLocalMap内部类实现细节
ThreadLocalMap实现思想二、属性与构造方法三、核心方法3.1 hashcode的计算3.2 set()方法3.3 getEntry()方法3.4 remove()方法3.5 rehash()方法3.6 对于清理过期数据的关键实现方法1. replaceStaleEntry()方法2. cleanSomeSlots方法3. expungeStaleEntry(int stal...原创 2019-11-26 21:49:44 · 837 阅读 · 0 评论 -
彻底搞懂ThreadLocal底层实现原理
当访问共享的可变数据时,通常需要使用同步。一种避免同步的方式就是不共享数据,仅在单线程内部访问数据,就不需要同步。该技术称之为线程封闭。当数据封装到线程内部,即使该数据不是线程安全的,也会实现自动线程安全性。原创 2019-11-26 21:47:18 · 930 阅读 · 0 评论 -
[并发概念] 同步与异步、阻塞与非阻塞
同步与异步同步与异步:被调用者是否主动告诉调用者结果,重心是被调用者。同步与异步通常用来形容一次调用,关注的是消息通信机制。同步调用一旦开始,调用者必须等到调用返回后,才能进行后续的行为。也就是说,调用者主动等待调用的结果。而异步则是相反,异步调用发出后,调用就会立即返回,告诉调用者我方收到请求已经去处理,调用者可以继续后续的操作。异步调用的操作通常在另外一个线程内真实的执行,完成后主动通知...原创 2019-12-31 23:34:28 · 1262 阅读 · 1 评论 -
[并发概念] 多线程与高并发
多线程的理解什么是多线程如果一个程序允许两个或者两个以上的线程,那么它便是多线程程序。多线程是指单个进程内允许多个线程。任务分为资源独立任务和资源共享任务。独立任务不需要使用多线程;共享任务,会使用到进程共享资源,需要保证线程安全。场景理解:房子与租客假设有一套房子,住着我和我的几个室友,房子比喻进程,我和室友比喻线程。房子中有很多公共空间,例如厨房、客厅,每个人都可以到客厅来。厨房和客...原创 2019-12-31 08:02:47 · 1560 阅读 · 1 评论 -
[并发概念] 串行、并行与并发
串行和并行串行是排队一个一个处理任务,并行是同时处理多个任务。并发和并行概念非常相似,难以区分。分别体现在两个方面。并发(Concurrency),体现在(1)单个处理器;(2)逻辑上同步运行。并行(Parallelism),体现在(1)多处理器,多核心;(2)物理上同步运行。并行的理解并行,是真正的同时运行–在同一个时刻多个任务同时执行。例如多核处理器上,有多个线程同时执行同...原创 2019-12-31 07:29:43 · 2271 阅读 · 0 评论 -
[并发概念] 进程与线程
[并发编程] 多线程概念的建立标签(空格分隔): 进程与线程 并行与并发 同步与异步 阻塞与非阻塞使用通俗易懂的语言讲述多线程领域最重要的概念。线程与进程串行、并行、并发多线程与高并发同步/异步、阻塞/非阻塞进程和线程操作系统是包含多个进程的容器,每个进程又都是容纳多个线程的容器。Oracle官方文档中的定义https://docs.oracle.com/cd/E1...原创 2019-12-29 23:00:31 · 851 阅读 · 1 评论