Skip to content

Java并发编程_基础概念_补充内容01

AQS

AbstractQueuedSynchronizer (AQS) 是 Java 并发包中的一个核心类,是许多同步组件的基础,比如 ReentrantLock, Semaphore, CountDownLatch, ReentrantReadWriteLock 等。

它提供了一种实现依赖于先进先出 (FIFO) 等待队列的阻塞锁和相关的同步器(semaphores, events, etc.)的框架。

AQS 是一个抽象类,定义了同步状态的获取和释放方法。

谈⼀下Java的共享内存模型JMM

JMM 是什么:

JMM 是 Java 并发编程相关的一组规范,它抽象了线程和主内存之间的关系,提供了一致性和可见性保证。

image.png

核心概念

image.png

可以了解一下 MESI 协议

image.png

谈⼀下volatile

ThreadLocal

ThreadLocal 一般是用作独立变量副本(线程的变量副本),避免线程共享变量可能导致的并发问题。

建议先看一下这篇文章: https://cloud.tencent.com/developer/article/1636025

ThreadLocal包含了四个方法:

void set(Object value)设置当前线程的线程局部变量的值。
public Object get()该方法返回当前线程所对应的线程局部变量。
public void remove()将当前线程局部变量的值删除,其目的是为了减少内存使用,加快内存回收。
protected Object initialValue()返回该线程局部变量的初始值,该方法是一个protected的方法,目的是为了让子类覆盖而设计的。

使用到 ThreadLocal 的三个常用场景:

    1. 代替参数的显示传递
    1. 全局存储用户信息
    1. 解决线程安全问题(比如数据库连接的Connection)

慎用的场景:线程池中线程调用使用ThreadLocal、异步程序;同时注意的是使用完ThreadLocal ,最好手动调用 remove() 方法。


关于 ThreadLocal 的数据结构,方法源码,扩容机制等可以看一下这篇文章: https://javaguide.cn/java/concurrent/threadlocal.html