随笔分类 - java基础部分
摘要:一、基础概念 在 Java中,主线程不能直接捕获子线程抛出的异常的!主要是因为子线程和主线程是独立的执行单元, 它们的执行是并发的,因此主线程无法捕获子线程的异常。子线程的异常通常由子线程自己处理或通过适当的异常处理机制处理。 那么也就是说,以下代码是无法生效的 public class Main
阅读全文
摘要:一、基础概念 死锁是指两个或两个以上的进程(或线程)在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用, 它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。 比如:丈母娘要求先买房才能结婚,但是女婿说先结婚买房 二、产生死
阅读全文
摘要:方案一、使用单线程线程池 我们可以使用 SingleThreadExecutor 这种线程池来执行任务,因为这个线程池中只有一个线程,所以它可以保证任务可以按照提交任务被顺序执行。 ExecutorService executor = Executors.newSingleThreadExecuto
阅读全文
摘要:一、定义 happens-before原则是一种用于描述多线程程序中操作执行顺序的规则。它是Java内存模型(Java Memory Model,JMM)的一部分: 如果一个操作 A “happen-before” 另一个操作 B,那么 A 的结果对 B 是可见的。这个概念是理解线程间内存可见性的关
阅读全文
摘要:一、AQS是如何实现线程的等待和唤醒的 ? AQS中线程等待和唤醒主要依赖 park 和 unpark 实现的。 当一个线程尝试获取锁或者同步器时,如果获取失败,AQS会将该线程封装成一个Node并添加到CLH等待队列中,然后通过 LockSupport.park() 将该线程阻塞。 当一个线程释放
阅读全文
摘要:一、类结构 先看一下LinkedBlockingQueue类里面有哪些属性: public class LinkedBlockingQueue<E> extends AbstractQueue<E> implements BlockingQueue<E>, java.io.Serializable
阅读全文
摘要:一、ArrayBlockingQueue类结构 先看一下ArrayBlockingQueue类里面有哪些属性: public class ArrayBlockingQueue<E> extends AbstractQueue<E> implements BlockingQueue<E>, java.
阅读全文
摘要:一、Condition的await()方法底层源码 以下是 ConditionObject 中 await 方法的源码及其详细分析: public final void await() throws InterruptedException { // 判断当前线程是否是中断状态,是就直接给个中断异常
阅读全文
摘要:一、DelayQueue的take()方法底层原理 DelayQueue 的 take 方法是其核心方法之一,用于从队列中获取并移除延迟时间到期的元素。如果队列为空或没有延迟到期的元素,调用 take 方法的线程会阻塞,直到有元素到期 1、take 方法的核心逻辑 take 方法的主要逻辑可以分为以
阅读全文
摘要:一、DelayQueue 底层原理 DelayQueue是一种本地延迟队列,比如希望我们的任务在5秒后执行,就可以使用DelayQueue实现。常见的使用场景有: 订单10分钟内未支付,就取消。 缓存过期后,就删除。 消息的延迟发送等。 但是DelayQueue是怎么使用的?底层原理是什么样的?如果
阅读全文
摘要:一、PriorityQueue作用和源码 PriorityQueue跟前几个阻塞队列不一样,并没有实现BlockingQueue接口,只是实现了Queue接口,Queue接口中定义了几组放数据和取数据的方法,来满足不同的场景 二、PriorityQueue类结构 public class Prior
阅读全文
摘要:一、SynchronousQueue底层实现原理剖 SynchronousQueue(同步移交队列),队列长度为0。作用就是一个线程往队列放数据的时候,必须等待另一个线程从队列中取走数据。同样,从队列中取数据的时候,必须等待另一个线程往队列中放数据 二、SynchronousQueue用法 先看一个
阅读全文
摘要:一、SynchronousQueue的put方法底层源码 SynchronousQueue 的 put 方法用于将元素插入队列。由于 SynchronousQueue 没有实际的存储空间,put 方法会阻塞,直到有消费者线程调用 take 方法移除元素 1、put 方法的作用 将元素插入队列。 如果
阅读全文
摘要:一、PriorityBlockingQueue 的put方法底层源码 PriorityBlockingQueue 的 put 方法用于将元素插入队列。由于 PriorityBlockingQueue 是一个无界队列,put 方法不会阻塞,总是会成功插入元素 1、put 方法的作用 将元素插入队列。
阅读全文
摘要:一、LinkedBlockingQueue的poll方法底层原理 LinkedBlockingQueue 的 poll 方法用于从队列头部移除并返回元素。如果队列为空,poll 方法会立即返回 null,而不会阻塞线程 1、poll 方法的作用 从队列头部移除并返回元素。 如果队列为空,立即返回 n
阅读全文
摘要:一、LinkedBlockingQueue的take方法底层源码 LinkedBlockingQueue 的 take 方法是其核心方法之一,用于从队列头部移除并返回元素。如果队列为空,调用 take 方法的线程会被阻塞,直到队列中有新元素 1、take 方法的作用 从队列头部移除并返回元素。 如果
阅读全文
摘要:一、LinkedBlockingQueue的put方法底层源码 LinkedBlockingQueue 的 put 方法是其核心方法之一,用于将元素插入队列。如果队列已满,调用 put 方法的线程会被阻塞,直到队列有空闲空间 1、put 方法的作用 将元素插入队列尾部。 如果队列已满,当前线程会被阻
阅读全文
摘要:一、ArrayBlockingQueue的poll方法底层原理 ArrayBlockingQueue 是 Java 并发包 (java.util.concurrent) 中的一个基于数组实现的有界阻塞队列。它的 poll() 方法是用于从队列中移除并返回队首元素的核心方法之一。与 take() 方法
阅读全文
摘要:一、ArrayBlockingQueue 的 take() 方法的底层源码的详细介绍 ArrayBlockingQueue 是 Java 并发包 (java.util.concurrent) 中的一个基于数组实现的有界阻塞队列。它的 take() 方法是用于从队列中移除并返回队首元素的核心方法之一。
阅读全文
摘要:一、ArrayBlockingQueue的put方法底层原理 ArrayBlockingQueue 是 Java 并发包 (java.util.concurrent) 中的一个基于数组实现的有界阻塞队列。它的 put 方法是用于向队列中插入元素的核心方法之一。当队列满时,put 方法会阻塞当前线程,
阅读全文

浙公网安备 33010602011771号