1. 程式人生 > 其它 >多執行緒與高併發(五)

多執行緒與高併發(五)

一、ThreadLocal

在ThreadLocal中設定的值是當前執行緒獨有的。往當前執行緒中設定的值只有當前執行緒可以訪問

Thread.currentThread.map(ThreadLocal,物件)

每個執行緒往ThreadLocal中設定的值都是往當前執行緒的map中設定的,不同的執行緒設定值在不同的map中

二、java引用

1、強引用

只要有一個引用指向這個物件,垃圾回收器一定不會回收 

2、軟引用:做快取用

有一個物件,有一個軟引用指向這個物件。只有當系統記憶體不足時,垃圾回收才會回收該物件

3、弱引用:只要遭遇到gc就會被回收

用在ThreadLocal中:Thread.currentThread.set(this,value)。this是一個返回值型別為ThreadLocal的entry,entry的父類是一個弱引用,是通過弱引用指向ThreadLocal

如上圖,如果entry不是返回值型別為ThreadLocal的弱引用,而是一個強引用,那麼當ThreadLocal物件被回收後,this物件不會被回收,會造成記憶體洩漏(永遠不會被回收)

當new出來的ThreadLocal物件被回收後,key為null,此時是get不到key為null的元素的value的,會造成記憶體洩漏

解決辦法:當ThreadLocal物件不用後呼叫remove方法

4、虛引用

 可以使用虛引用,清理堆外記憶體

三、AQS

1、AQS是JUC下的一個類,由一個voliate的int型別的state+雙向佇列組成

2、AQS的兩種功能:排他鎖和共享鎖

  排他鎖:同一時間只允許一個執行緒獲取鎖資源,ReentrantLock

  共享鎖:同一時間允許多個執行緒獲取鎖資源,如CountDownLatch

3、AQS是基於雙向佇列和CAS的方式操作state的

  CAS:compareAndSet