并发

88 阅读3分钟

对象头

对象头主要包括两部分数据:Mark Word(标记字段)、Klass Pointer(类型指针)。

Mark Word:默认存储对象的HashCode,分代年龄和锁标志位信息。

Klass Point:对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。

synchronized

image.png

synchronized 是非公平、可重入锁。

synchronized 是一个重量级操作,需要调用操作系统相关接口,性能是低效的,有可能给线程加锁消耗的时间比有用操作消耗的时间更多。

image.png

wait 和 notify、notifyAll

wait/notify/notifyall必须在synchronized代码块里面。

wait方法只是无参和带超时时间2种方法,调用wait方法的的线程会进入waiting或timed_waiting状态;

notify方法:调用notify方法的线程,会唤醒一个处于waiting状态的线程;

notifyall方法:调用notify方法的线程,会唤醒所有处于waiting状态的线程。

尽量使用notifyAll,因为notify有可能导致死锁。

Lock

ReetrantLock(可重入锁)、ReadWriteReetrantLock(可重入读写锁)、StampedLock(增强读写锁)

可配置为公平锁和非公平锁,非公平锁在性能上高于公平锁,但是非公平锁有可能导致线程饥饿,尤其是超时限制的场景。

Condition

await

signal

signalAll

AQS

AbstractQueuedSynchronizer,java实现同步的一个框架

AQS的核心思想是对于共享资源,维护一个双端队列来管理线程,队列中的线程依次获取资源,获取不到的线程进入队列等待,直到资源释放,队列中的线程依次获取资源。 AQS的基本框架如图所示:

image.png

实现方法主要有tryAquire和tryRelease,表示独占模式的资源获取和释放,tryAquireShared和tryReleaseShared表示共享模式的资源获取和释放。

原子类

信号量

基于AQS实现;

JUC

锁、原子类、阻塞队列、ConcurrentHashMap、CopyOnWriteArrayList

ConcurrentHashMap

ThreadLocal

ThreadLocal的作用是提供线程内的局部变量。可能会出现内存泄露。

线程状态

线程池

ThreadPoolExecutor

核心参数:

1、核心线程数

2、工作线程数

3、超时时间

4、时间单位

5、阻塞队列

6、ThreadFactory

7、拒绝策略

拒绝策略:

    • CallerRunsPolicy:这是默认的拒绝策略,当线程池队列已满并且无法处理新任务时,将由提交任务的线程来执行该任务。这种策略可以降低新任务的流量,但也会增加提交任务的线程的负载。
    • AbortPolicy:当线程池队列已满并且无法处理新任务时,将抛出RejectedExecutionException异常,阻止新任务的提交。
    • DiscardPolicy:当线程池队列已满并且无法处理新任务时,将默默地丢弃该任务,不会给出任何提示或警告。
    • DiscardOldestPolicy:当线程池队列已满并且无法处理新任务时,将丢弃队列中最早的未处理任务,并尝试重新提交新任务。这种策略可以保证不会丢失任何任务,但可能会影响到队列中已经等待很长时间的任务。