构建Java知识体系(并发篇)
文章平均质量分 97
构建自己的Java知识体系
家乡的落日
博观约取,厚积薄发。拒绝浮躁,保持谦逊。
展开
-
Java并发编程基础知识点
start当两个或多个线程互相等待对方释放资源时,就会发生死锁。例如:有两只狗秀逗和四眼,秀逗和它的好兄弟四眼都着急上厕所,假设上厕所需要拿到厕所钥匙和手纸,此时秀逗抢到了钥匙,四眼抢到了手纸。它俩谁也不让谁,秀逗拿着钥匙等待四眼给它手纸,四眼拿着手纸等秀逗给它钥匙。等着等着,两只狗都崩裤兜里了。。。这就是出现了线程死锁,反应到计算机上,可能的问题就是导致线程无法继续往下运行,还会导致计算机资源无法释放,系统可用资源逐渐减少,最终可能导致系统资源耗尽。参与死锁的线程无法继续执行,造成这些线程的永久阻塞。原创 2024-06-30 22:18:29 · 1011 阅读 · 0 评论 -
JMM(Java内存模型)详解
为了对上面的问题进行更深入的探究,我有查了一些JIT相关的资料。简单总结下JIT然后再对上面的问题分析下。JIT(Just-In-Time)编译器是Java虚拟机(JVM)中的一个关键组件,它负责在程序运行过程中动态地将字节码(即Java编译后的.class文件中的代码)转换为特定于平台的机器代码。这一过程旨在提高程序的执行效率,因为它能够针对运行时的数据和实际使用模式进行优化,而不仅仅是基于静态代码分析。JIT工作原理加载与解释执行:当Java程序启动时,JVM首先加载类文件并由解释器执行字节码。原创 2024-07-03 09:21:13 · 3242 阅读 · 0 评论 -
Java中volatile关键字详解(详细图文)
经过上面那么多的铺垫,我们再来总结下,整体思路就非常清晰了。JVM中通过下面这四个函数来实现编译器屏障和 CPU指令(硬件)屏障volatilevolatile 关键字保证有序性的原理:JVM通过JMM(Java内存模型)规范定义volatile关键字保证有序性,主要是通过内存屏障机制(包括编译器屏障,CPU指令屏障)来确保编译器生成的汇编代码保持程序员期望的执行顺序,并且确保处理器(CPU)按照顺序执行指令。原创 2024-07-05 17:54:33 · 1829 阅读 · 0 评论 -
synchronized关键字详解(全面分析)
synchronized 直译为 同步,它的作用是实现线程同步, synchronized 能够确保同一时刻只有一个线程可以执行某个代码块或方法,我们可以把共享变量的修改放在synchronized 修饰的代码块中或者方法中,从而避免多个线程同时访问共享资源时引发的线程安全问题。①、synchronized关键字用在代码块上,锁是synchonized括号里配置的对象,可以实现类级别的同步(使用类的Class对象作为锁,或者使用静态实例变量作为锁)。也可以实现对象级别的同步(使用类的实例变量作为锁)。原创 2024-07-11 23:19:16 · 1116 阅读 · 0 评论 -
AQS详解(详细图文)
至此大概能够了解到AQS内部的一些实现了,Node类用于在AQS的同步队列和条件队列中维护线程的等待状态和链表结构。通过waitStatus字段和链表结构,AQS能够有效管理线程的阻塞、唤醒和取消操作,保证并发环境下的线程同步。之前在synchronized关键字详解这篇文章中有说过锁的本质。实际上无论是锁还是别的什么同步器,比如JVM对应synchronized底层锁的实现、亦或是AQS及其子类,它们实现的思想都差不多。原创 2024-07-17 23:49:55 · 693 阅读 · 0 评论 -
LockSupport详解
LockSupport 是 Java 并发包(java.util.concurrent)中的一个工具类,提供了基本的线程阻塞和唤醒机制。它主要用于实现锁和其他同步类,如AQS、 ReentrantLock、Semaphore、CountDownLatch 等。LockSupport 提供的主要方法是park和unpark,它们分别用于挂起和唤醒线程(会让线程进入WATING状态)。AQS中对线程进行挂起和唤醒操作最终使用的就是和。AQS相关内容可以参考 我的上一篇博客AQS详解。原创 2024-07-18 22:24:43 · 945 阅读 · 0 评论 -
JUC包下的并发工具类
并发工具类主要功能用法示例特点与注意事项CountDownLatch (倒计数器)允许一个或多个线程等待其他线程完成操作后再继续执行- 只能使用一次,不能重置 - 适用于一次性事件,例如等待多线程计算完成后汇总结果CyclicBarrier (循环屏障)使一组线程到达一个屏障点时被阻塞,直到最后一个线程到达屏障点,所有线程才继续执行- 可以重用,适用于多次执行的场景- 适用于需要多个线程同时开始某些任务的场景,例如多线程处理数据后同时汇总Semaphore (信号量)原创 2024-07-23 09:35:23 · 977 阅读 · 0 评论 -
ThreadLocal详解
get() 方法首先获取当前线程,然后尝试从当前线程的 ThreadLocalMap 中获取与当前 ThreadLocal 实例关联的值。如果找到了该值,则直接返回;否则调用 setInitialValue() 设置并返回初始值。getMap(Thread t) 方法返回当前线程的 ThreadLocalMap。> key) 方法通过计算哈希值获取与 key 关联的条目,如果没有找到,则调用 getEntryAfterMiss 继续查找。原创 2024-07-23 18:07:41 · 2116 阅读 · 0 评论 -
Java锁详解(包含Lock接口ReentrantLock详解)
首先非公平是说先尝试获取锁的线程并不一定比后尝试获取锁的线程优先获取锁。原创 2024-07-24 17:30:28 · 878 阅读 · 0 评论 -
ReentrantReadWriteLock详解
ReentrantReadWriteLock 只是读写锁思想的一个具体Java实现。重要的是理解这种思想。掌握这些思想可以帮助我们在不同编程语言或框架中应用类似的锁机制。《图解Java多线程设计模式》《Java并发编程的艺术》原创 2024-07-27 15:32:00 · 818 阅读 · 0 评论 -
StampedLock详解
是JUC并发包里面 JDK8 版本新增的一个锁,是读写锁的一种具体实现,和不同的是其不提供可重入性,不基于某个类似Lock或者ReadWriteLock接口实现,而是基于CLH锁思想实现这点这AQS有些类似,并且StampedLock不支持条件变量Condition。关于可以参考上篇文章 ReentrantReadWriteLock详解。那么JDK既然实现了这个锁,就说明这个锁一定有优势,那就是性能优势,下面会具体分析。原创 2024-07-28 17:38:56 · 1435 阅读 · 0 评论 -
Java线程池原理剖析和应用指南
目录Java线程池详解一、Java线程池简介池化思想池化思想的优点二、线程池的实现原理分析实现线程池需要考虑哪些问题?线程池的简单使用示例线程池原理的简单图示三、Executor详解Executor简介Executor框架的继承结构总结ExecutorExecutorService四、ThreadPoolExecutor 详解线程池的七个参数线程池的任务调度流程图示WorkThread模式和Future模式线程池的状态和内部结构线程池的关闭线程池的状态转换图工作线程`Worker``execute`方法详解原创 2024-08-04 11:22:41 · 1085 阅读 · 0 评论 -
FutureTask详解
接口功能描述主要方法/特点适用场景Runnable定义要执行的任务,无返回值run()用于执行不需要结果的任务,如线程的任务Callable定义要执行的任务,有返回值,并可能抛出异常call()用于执行有返回值的任务Future管理异步计算的结果,检查状态和处理异常get()cancel()isDone()用于管理异步任务的结果和状态结合Runnable和Future的功能,可以执行任务并管理结果继承Runnable和Future用于需要同时支持Runnable和Future功能的场景,如。原创 2024-08-05 22:50:58 · 1596 阅读 · 0 评论 -
CompletableFuture详解+实战
是 Java 8 引入的一个用于异步编程的类。在出现之前,我们可以使用线程池配合Future来处理异步任务。但是线程池的异步操作功能难以编写复杂异步操作的组合和控制。所以JDK8推出了,它允许我们编写非阻塞的代码,并提供了一种简洁的方式来处理异步任务和并发操作,支持多种异步操作的组合和控制。默认情况下,使用公共的作为线程池。这个线程池是全局共享的,如果过多异步任务占用这个线程池会导致资源紧张,也不利于线程管理。建议使用方法,将自定义的Executor传递给。原创 2024-08-10 17:28:26 · 1262 阅读 · 0 评论 -
Java CAS、Unsafe类、原子类详解
CAS(Compare-And-Swap),直译为比较交换。CAS是一种用于多线程编程的原子操作。主要用于无锁算法和无锁数据结构的实现。Unsafe类在之前AQS详解和LockSupport详解中都有提到。Unsafe听名字就知道这个类不安全,它是Java平台提供的一个内部类,位于sun.misc包下,它允许Java代码直接访问和操作底层内存,执行一些通常被认为是不安全的操作。原创 2024-07-22 10:31:30 · 1068 阅读 · 0 评论 -
final关键字详解
This逃逸(This Escape)是指在对象的构造过程中,this引用被暴露到构造函数外部的情况。这种暴露可能会导致未完全构造的对象被其他线程访问,从而引发不确定的行为和潜在的并发问题。原创 2024-07-13 17:16:45 · 670 阅读 · 0 评论