AQS源码阅读与强软弱虚4种引用
2024-01-09 02:55:47
## AQS源码阅读
AQS(AbstractQueuedSynchronizer)是Java并发编程中一个非常重要的类,它提供了锁和同步器的基本实现。AQS的设计非常巧妙,它可以支持多种类型的锁,如公平锁、非公平锁、读写锁等。同时,AQS还提供了很多同步原语,如Condition、Semaphore等,这些同步原语可以帮助我们实现各种复杂的并发编程场景。
1. AQS的核心思想
AQS的核心思想是使用一个共享的int类型变量state来表示锁的状态。state的值可以取多个不同的值,每个值都对应着不同的锁状态。例如,state的值为0表示锁是未锁定的,state的值为1表示锁是已经被某个线程锁定的,state的值为-1表示锁正在被某个线程等待。
2. AQS的实现细节
AQS的实现细节非常复杂,这里我们只简单介绍一下它的主要实现原理。AQS使用了一个队列来存储等待获取锁的线程。当一个线程想要获取锁时,它会先尝试获取锁。如果锁已经被其他线程锁定了,那么该线程就会被加入到队列中等待。当锁被释放时,队列中的第一个线程就会被唤醒并获取锁。
## 强软弱虚4种引用
在Java中,引用分为强引用、软引用、弱引用和虚引用。这四种引用都属于GC(垃圾回收)的根引用,但它们对GC的行为有不同的影响。
1. 强引用
强引用是最常见的引用类型,它指向的对象不会被GC回收。只要强引用还存在,对象就不会被回收。
2. 软引用
软引用指向的对象可以被GC回收,但只有在GC确定对象没有任何强引用时才会被回收。这意味着,如果对象还有其他强引用或软引用,那么它就不会被GC回收。
3. 弱引用
弱引用指向的对象可以被GC回收,只要GC确定对象没有任何强引用或软引用时就会被回收。这意味着,弱引用指向的对象很容易被GC回收。
4. 虚引用
虚引用指向的对象可以被GC回收,但GC不会通知虚引用。这意味着,我们无法知道对象什么时候被GC回收了。虚引用主要用于跟踪对象的回收情况。
## ThreadLocal原理与源码
ThreadLocal是一个非常有用的类,它可以为每个线程维护一个独立的变量副本。这意味着,每个线程都可以访问自己的变量副本,而不会受到其他线程的影响。ThreadLocal的原理非常简单,它使用了一个Map来存储每个线程的变量副本。当一个线程第一次访问ThreadLocal变量时,ThreadLocal就会创建一个Map并把变量副本存储到Map中。之后,该线程就可以访问自己的变量副本了。
1. ThreadLocal的源码分析
ThreadLocal的源码非常简单,这里我们只简单介绍一下它的主要实现原理。ThreadLocal使用了一个ThreadLocalMap来存储每个线程的变量副本。ThreadLocalMap是一个HashMap,它的key是Thread,value是变量副本。当一个线程第一次访问ThreadLocal变量时,ThreadLocal就会创建一个ThreadLocalMap并把变量副本存储到ThreadLocalMap中。之后,该线程就可以访问自己的变量副本了。