ThreadLocal详解

ThreadLocal解析

本文参照一枝花算不算浪漫

ThreadLocal的特点:

  • 线程并发:在多线程场景下
  • 传递数据:可以通过ThreadLocal在同一线程,不同组件中传递公共变量
  • 线程隔离:每个线程的变量都是独立的,不会相互影响

主要探讨以下问题:

  • ThreadLocal的key是弱引用,那么在ThreadLocal.get()的时候,发生GC之后,key是否为null?
  • ThreadLocal中ThreadLocalMap的数据结构?
  • ThreadLocalMap的Hash算法?
  • ThreadLocalMap的扩容机制?
  • ThreadLocalMap中过期key的清理机制?探测式清理和启发式清理流程?
  • ThreadLocalMap.set()方法实现原理?
  • ThreadLocalMap.get()方法实现原理?
阅读更多

Java常见并发容器总结

Java常见并发容器总结

JDK提供的并发容器大部分都在java.util.concurrent(juc)

  • ConcurentHahsMap:线程安全的HashMap
  • CopyOnWriteArrayList:线程安全的List,适用于读多写少的场景。
  • ConcurrentLinkedQueue:高效的并发队列,使用链表实现。可以当作一个线程安全的LinkedList,这是一个非阻塞队列。
  • BlockingQueue:这个一个接口,JDK内部通过链表、数组等方式实现了这个接口。表示阻塞队列,适合用于作为数据共享的通道。
  • ConcurrentSkipListMap:线程安全的跳表。
阅读更多

Atomic原子类总结

Atomic原子类

Atomic是基于unsafe类和自旋操作实现的,要理解Atomic首先需要理解CAS。Atomic是指一个操作是不可中断的,即使在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。

所以,所谓源自类就说具有原子/原子操作特征的类。根据操作的数据类型,可以讲JUC包中的原子类分为4类。

要理解Atomic首先得了解CAS,CAS(Compare and Swap),其功能就是判断内存中的某个值是否与预期的值相等,相等就用新值更新旧值,否则就不更新。Java中CAS是基于unsafe类首先的,所有的unsafe类中的方法都是native(原生)方法,直接调用操作系用底层资源执行任务。

阅读更多

AQS原理以及AQS同步组件总结

AQS介绍

AQS全称(AbstractQueuedSynchronizer),即抽象队列同步器。该类位于java.util.concurrent.locks包下。

AQS是一个抽象类,主要用来构建锁和同步器。AQS 为构建锁和同步器提供了一些通用功能的是实现,因此,使用 AQS 能简单且高效地构造出应用广泛的大量的同步器,比如 ReentrantLockSemaphore,其他的诸如 ReentrantReadWriteLockSynchronousQueueFutureTask(jdk1.7) 等等都是基于 AQS 的。

阅读更多

从ReentrantLock的角度分析AQS的原理以及应用

从ReentrantLock的角度分析AQS的原理以及应用

本文转载自美团技术团队从ReentrantLock的实现看AQS的原理及应用

前言

Java中的大部分同步类(Lock、Semaphore、ReentrantLock等)都是基于AbstractQueuedSynchronizer(简称为AQS)实现的。AQS是一种提供了原子式管理同步状态、阻塞和唤醒线程功能以及队列模型的简单框架。本文会从应用层逐渐深入到原理层,并通过ReentrantLock的基本特性和ReentrantLock与AQS的关联,来深入解读AQS相关独占锁的知识点,同时采取问答的模式来帮助大家理解AQS。由于篇幅原因,本篇文章主要阐述AQS中独占锁的逻辑和Sync Queue,不讲述包含共享锁和Condition Queue的部分(本篇文章核心为AQS原理剖析,只是简单介绍了ReentrantLock,感兴趣同学可以阅读一下ReentrantLock的源码)。

下面列出本篇文章的大纲和思路,以便于大家更好地理解:

阅读更多

Java线程池介绍

线程池

为什么要使用线程池?

池化技术 (Pool) 是一种很常见的编程技巧,在请求量大时能明显优化应用性能,降低系统频繁建连的资源开销。我们日常工作中常见的有数据库连接池、线程池、对象池等,它们的特点都是将 “昂贵的”、“费时的” 的资源维护在一个特定的 “池子” 中,规定其最小连接数、最大连接数、阻塞队列等配置,方便进行统一管理和复用,通常还会附带一些探活机制、强制回收、监控一类的配套功能。

普通情况下,我们需要使用线程的时候就直接去创建一个线程,这样子操作的方式十分简单,但是在高并发的情况下就会产生问题:

并发的线程数量过多,而每个线程完成其任务后便会被销毁,往往其执行的时间很短,这样频繁地创建线程就会大大降低系统的效率,因为频繁创建和销毁线程时间的开销很大。

阅读更多
Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×