
Thread
Thread
Gene Xu
个人博客:https://blog.xujun.pro;个人公众号:Sakura动漫ACG
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Concurrent -- 08 -- Exchanger用法解析
Exchanger,即交换器,是一个同步工具类,用于控制两个线程在同步点处的数据交换Exchanger 提供了一个同步点 (调用 exchange() 方法的地方即为同步点),当一个线程先执行到达同步点后,会被阻塞,直到另一个线程也进入到同步点为止,当两个线程都到达该同步点后,就会进行数据交换举例说明 1ExchangerTest.javapublic class ExchangerTest { public static void main(String[] args) {原创 2020-07-26 15:48:50 · 204 阅读 · 0 评论 -
Concurrent -- 07 -- Semaphore源码解析
Semaphore,即信号量,是一个同步工具类,用于控制某个资源可被同时访问的线程个数一、内部类解析Syncabstract static class Sync extends AbstractQueuedSynchronizer { private static final long serialVersionUID = 1192457210091910933L; // Sync 构造方法,初始化许可数目 Sync(int permits) { set原创 2020-07-26 15:44:23 · 200 阅读 · 0 评论 -
Concurrent -- 06 -- CyclicBarrier源码解析
CyclicBarrier,即循环栅栏,是一个同步工具类,用于阻塞当前线程,等待其他线程,所有线程都必须同时到达栅栏位置后,才可以继续执行当所有线程都达到栅栏位置后,可以触发执行一个预先设置好的任务一、内部类解析Generationprivate static class Generation { // 标记当前代是否损坏 boolean broken = false;}Generation 是 CyclicBarrier 的内部类,用于帮助 CyclicBarrie原创 2020-07-26 15:27:23 · 235 阅读 · 0 评论 -
Concurrent -- 05 -- CountDownLatch源码解析
CountDownLatch,即倒计时器,是一个同步工具类,用于协调多个线程之间的同步,常用来控制线程等待,它可以让某个线程一直处于等待状态直到倒计时结束后再开始执行一、内部类解析Syncprivate static final class Sync extends AbstractQueuedSynchronizer { private static final long serialVersionUID = 4982264981922014374L; // Sync 构造方原创 2020-07-25 23:57:50 · 208 阅读 · 0 评论 -
Concurrent -- 04 -- HashMap源码解析(JDK8)
HashMap 是我们日常开发过程中使用的最多的集合类之一,最早出现在 JDK2 中,以 key、value 的形式保存具有映射关系的两个数据 (由 key、value 两个值组成的键值对),其中 key 是不可重复的,value 是可重复的,key 和 value 都可以存放 null,但 key 只能存在一个 null,value 可以存在一个或多个 null简单地了解了 HashMap 后,让我们来深入了解下它的底层实现原理一、数据结构在 JDK8 之前的版本中,HashMap 底层采用.原创 2020-07-25 17:21:27 · 413 阅读 · 0 评论 -
ThreadLocal -- 03 -- ThreadLocal源码解析
ThreadLocal,用于提供线程局部变量,常用于多线程环境下对非线程安全资源的并发访问,如果我们不想加锁,就可以使用 ThreadLocal 来使得每个线程都持有一个该资源的副本,各个线程之间互不干扰ThreadLocal 与各种锁机制相比,侧重于以空间换时间,来提高并发效率一、内部类解析SuppliedThreadLocal<T>static final class SuppliedThreadLocal<T> extends ThreadLocal<T&g原创 2020-07-22 11:46:43 · 253 阅读 · 0 评论 -
ThreadLocal -- 02 -- InheritableThreadLocal源码解析
InheritableThreadLocal 继承自 ThreadLocal,用于提供从父线程到子线程值的继承一、方法解析1、childValue(T parentValue) 相关方法childValue(T parentValue)protected T childValue(T parentValue) { return parentValue;}在创建子线程时,根据父线程的值来计算可被继承的局部变量在子线程中的初始值在启动子线程之前,会在父线程中调用此方法,此方原创 2020-07-22 11:23:45 · 232 阅读 · 0 评论 -
ThreadLocal -- 01 -- ThreadLocal内部类ThreadLocalMap源码解析
ThreadLocalMap 是 ThreadLocal 的内部类,是一个自定义的哈希映射,用于维护线程的局部变量;其方法的访问权限都是私有的,因此只有 ThreadLocal 可以调用 ThreadLocalMap 中的方法,而其他类则不可以;此外其类访问权限是包级别的,也就是同一个包下面的类可以访问 ThreadLocalMap,但是不能调用 ThreadLocalMap 中的方法一、数据结构在 Thread 类中有一个类型为 ThreadLocal.ThreadLocalMap 的变量 th原创 2020-07-22 10:34:26 · 300 阅读 · 0 评论 -
Concurrent -- 03 -- AQS源码解析
AQS (AbstractQueuedSynchronizer) 是用于构建锁或其他同步组件的基础框架类,在 Java 中许多并发工具类的内部类实现都依赖于 AQS,如:ReentrantLock、Semaphore、CountDownLatch 等,是 JUC 包的核心组件一、实现原理AQS 的核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态;如果被请求的共享资源被占用,则会阻塞当前请求资源的线程,并将其以及状态信息包裹成一个 Node原创 2020-05-17 22:24:31 · 266 阅读 · 0 评论 -
Concurrent -- 02 -- CAS源码解析
CAS (Compare And Swap),即比较并交换,是一种高效实现线程安全性的方法,其需要有三个操作数,分别是内存地址 (在 Java 中可以简单地理解为变量的内存地址,用 V 表示)、旧的预期值 (用 A 表示) 和准备设置的新值 (用 B 表示)属于乐观锁机制支持原子性更新操作,适用于计数器、序列发生器等场景CAS 操作失败时,由我们自行决定是否继续尝试,还是执行别的操作当执行 CAS 指令时,当且仅当 V 符合 A 时,处理器才会用 B 去更新 V 的值,否则它就不执行原创 2020-05-17 22:18:38 · 212 阅读 · 0 评论 -
Concurrent -- 01 -- ThreadPoolExecutor源码解析
在项目开发过程中,服务端会接收请求并进行处理,当请求数量不大时,我们可以为每个请求都分配一个线程,而当请求数量很大时,如果还是为每个请求都分配一个线程的话,会导致频繁地创建和销毁线程,从而大大降低了系统的效率,这个时候,线程池便派上了用场,通过对线程的重复使用,大大地提高了系统的效率总的来说,线程池的优点可以归纳为以下几点降低资源消耗通过重复利用已创建的线程降低线程创建和销毁造成的消耗提高响应速度当任务达到时,可以不需要等待新的线程创建就能立即执行提高线程的可管理性线程是原创 2020-05-17 22:15:05 · 323 阅读 · 0 评论 -
Thread -- 10 -- interrupt()、interrupted()、isInterrupted()方法的区别
一、interrupt()public void interrupt() { if (this != Thread.currentThread()) checkAccess(); synchronized (blockerLock) { Interruptible b = blocker; if (b != null) { interrupt0(); // Just to set the inte原创 2020-05-17 19:14:31 · 310 阅读 · 0 评论 -
Lock -- 04 -- ReentrantLock底层实现原理
ReentrantLock (重入锁) 是 Lock 接口最常见的一种实现,它与 synchronized 一样是可重入的,在基本语法上,ReentrantLock 也与 synchronized 很相似,只是代码写法上稍有区别而已ReentrantLock 相比 synchronized 增加了一些高级功能,主要有以下三项等待可中断是指当有锁的线程长期不释放锁的时候,正常等待的线程...原创 2020-05-02 16:47:56 · 944 阅读 · 0 评论 -
Lock -- 03 -- synchronized的优化
在 JDK6 中,虚拟机团队在 JVM 层面对 synchronized 做了大量优化,如:自适应自旋锁 (Adaptive Spinning)、锁消除 (Lock Eliminate)、锁粗化 (Lock Coarsening)、轻量级锁 (Lightweight Locking)、偏向锁 (Biased Locking),这些技术都是为了在线程之间更高效地共享数据,以及解决竞争问题,从而提高程...原创 2020-04-29 09:21:55 · 266 阅读 · 0 评论 -
Lock -- 02 -- synchronized底层实现原理
在 Java 虚拟机中,同步是基于进入和退出管程 (Monitor) 对象来实现的,每个 Java 对象天生自带了一把看不见的锁,这个即为 Monitor 锁 (也称为管程或监视器锁),我们可以把它理解成一个同步工具,也可以描述为一种同步机制,通常它被描述为一个对象在此之前,我们需要先来了解一下 Java 对象头,其主要有以下三个部分Mark WordMark Word 用于存储对...原创 2020-04-29 09:11:40 · 348 阅读 · 0 评论 -
Lock -- 01 -- synchronized的基本概念
在 Java 多线程编程中,我们需要重点关注一个问题,那就是线程安全问题,造成线程安全的原因,有以下两点存在共享数据 (也称为临界资源)存在多个线程共同操作共享数据为了解决该问题,我们需要引进这么一个方法当存在多个线程共享数据时,需要保证同一时刻有且只有一个线程在操作共享数据,其他线程必须等待该线程处理完数据后再进行此时,便引入了互斥锁的概念,其有以下两点特性互斥...原创 2019-09-26 21:35:59 · 332 阅读 · 0 评论 -
Thread -- 09 -- interrupt()方法的使用
这里我们再来了解下 interrupt() 方法的使用一、举例说明public class InterruptDemo { public static void main(String[] args) throws InterruptedException { Runnable interruptTask = () -> { int ...原创 2019-08-16 15:21:06 · 237 阅读 · 0 评论 -
Thread -- 08 -- yieled()方法的使用
这里我们再来了解下 yield() 方法的使用,但在日常的开发过程中,我们很少会用到该方法一、举例说明public class YieldDemo { public static void main(String[] args) { Runnable yieldTask = () -> { for (int i = 0; i <...原创 2019-08-14 09:03:01 · 443 阅读 · 0 评论 -
Thread -- 07 -- notify()和notifyAll()的区别
这里我们再来了解下 notify() 方法和 notifyAll() 方法的区别一、举例说明public class NotificationDemo { private volatile boolean go = false; public static void main(String[] args) throws InterruptedException { ...原创 2019-08-13 23:09:02 · 495 阅读 · 0 评论 -
Thread -- 06 -- sleep()和wait()的区别
这里我们再来了解下 sleep() 方法和 wait() 方法的区别一、举例说明public class WaitSleepDemo { public static void main(String[] args) { final Object lock = new Object(); new Thread(() -> { ...原创 2019-08-13 21:46:48 · 238 阅读 · 0 评论 -
Thread -- 05 -- start()与run()的区别
在平常使用线程的过程中,我们可定会有这么一个疑问,启用线程时使用 start() 方法而不是 run() 方法,这两个方法之间究竟有什么区别呢,这里让我们来一起深入了解下一、举例说明例子一 (调用 run() 方法)public class CurrentThreadTest { private static void attack() { System.o...原创 2019-08-13 11:27:52 · 277 阅读 · 0 评论 -
Thread -- 04 -- Thread和Runnable的区别
在日常开发过程中,除了使用线程池来创建线程外,我们还可以通过继承 Thread 类或者实现 Runnable 接口来创建线程,那么它们之间又有什么区别呢,这里让我们来一起深入了解下一、举例说明例子一 (继承 Thread 类)public class MyThread extends Thread { private String name; private int...原创 2019-08-12 22:37:14 · 379 阅读 · 0 评论 -
Thread -- 03 -- 实现处理线程的返回值
在日常开发过程中,有的程序的执行是依赖于子任务的返回值进行的,当子任务交给子线程去完成的时候,我们需要获取到子线程执行完毕后的返回值,现在让我们来看看如何实现处理线程的返回值实现的方式主要有三种主线程等待法使用 Thread 类的 join() 方法阻塞当前线程以等待子线程处理完毕实现 Callable 接口,通过 Future 或 FutureTask 来获取主...原创 2019-08-12 21:55:43 · 630 阅读 · 1 评论 -
Thread -- 02 -- 线程的六种状态
通过 Thread 类的源码可知,线程有六大状态,分别是:NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED,现在让我们来看看它们的具体含义NEW新生状态线程创建后,但尚未启动RUNNABLE运行状态处于运行状态的线程,可能正在执行 (Runnging),也有可能等待着 CPU 为其分配执行时间 (...原创 2019-08-11 21:01:28 · 300 阅读 · 0 评论 -
Thread -- 01 -- 进程和线程的区别
这里我们来了解一下进程和线程的区别,在了解区别之前,我们首先来了解下进程和线程的由来一、进程和线程的由来初期的计算机只能串行执行任务,并且需要长时间等待用户输入,效率十分低下后来为了提升计算机的执行效率,不用等待用户的输入,对计算机进行了改良:预先将用户的指令集中成清单,然后一次性交给计算机,计算机不断地去读取指令然后进行相应的操作,但仍然无法并发执行然后在接下来的发展中...原创 2019-08-11 20:53:35 · 319 阅读 · 0 评论