对象头
对象头主要包括两部分数据:Mark Word(标记字段)、Klass Pointer(类型指针)。
Mark Word:默认存储对象的HashCode,分代年龄和锁标志位信息。
Klass Point:对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。
synchronized
synchronized 是非公平、可重入锁。
synchronized 是一个重量级操作,需要调用操作系统相关接口,性能是低效的,有可能给线程加锁消耗的时间比有用操作消耗的时间更多。
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的基本框架如图所示:
实现方法主要有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:当线程池队列已满并且无法处理新任务时,将丢弃队列中最早的未处理任务,并尝试重新提交新任务。这种策略可以保证不会丢失任何任务,但可能会影响到队列中已经等待很长时间的任务。