日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

多线程与高并发(五):强软弱虚四种引用以及ThreadLocal的原理与源码

發布時間:2024/2/28 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多线程与高并发(五):强软弱虚四种引用以及ThreadLocal的原理与源码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

上節回顧

AQS(CLH的變種)

因為新加進來的節點要查看前面的節點的狀態,所以使用的是雙向鏈表。

AQS的底層是 CAS + Volitile,用CAS替代了鎖整個鏈表的操作。

公平鎖:上來先排隊
非公平鎖:上來直接搶鎖

state 根據子類不同的實現,取不同的意義。
AQS類中有一個內部類Node,里面裝的是它的成員變量Thread。很多Node組成一個雙向鏈表,就是一個等待隊列。

非公平的時候,如果搶不到鎖,就進入隊列繼續等待。
如果搶到了,就用CAS的方式設定當前線程為獨占這把鎖的線程。

VarHandle
面試用,實際項目幾乎沒用,講出來讓別人聽不懂…

  • 普通屬性也可以進行原子操作
  • 比反射快,直接操作二進制碼
  • jdk1.9之后才有(下面這個程序,我用11.0.3會報錯找不到包,暫時沒有找到原因)
package com.mashibing.juc.c_021_03_VarHandle;import java.lang.invoke.MethodHandles; import java.lang.invoke.VarHandle;public class T01_HelloVarHandle {int x = 8;private static VarHandle handle;static {try {handle = MethodHandles.lookup().findVarHandle(T01_HelloVarHandle.class, "x", int.class);} catch (NoSuchFieldException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}public static void main(String[] args) {T01_HelloVarHandle t = new T01_HelloVarHandle();//plain read / writeSystem.out.println((int)handle.get(t));handle.set(t,9);System.out.println(t.x);handle.compareAndSet(t, 9, 10);System.out.println(t.x);handle.getAndAdd(t, 10);//原子性的,保證了線程安全System.out.println(t.x);} }

ThreadLocal

ThreadLocal 修飾的變量,是線程獨有的

為什么要有ThreadLocal?
Spring的聲明式事務會用到。
Spring的聲明式事務在一個線程里。
connection在連接池里,不同的connection之間怎么形成完整的事務?
把connection放在當先線程的ThreadLocal里面,以后拿的時候從ThreadLocal直接拿,不去線池里面拿。

ThreadLocal是怎么做到的?
222行的this是當前的ThreadLocal對象。

ThreadLocalMap是當前Thread的一個成員變量。

強軟弱虛四種引用

之前寫過完整的博客:
【Java】強軟虛弱引用類型;弱引用在ThreadLocal中的應用

在垃圾回收的時候,各種引用類型的表現?

強引用

Object strongReference = new Object();

只要有引用指向它,就不會被回收。
當內存空間不足時,Java虛擬機寧愿拋出OutOfMemoryError錯誤,使程序異常終止,也不會靠隨意回收具有強引用的對象來解決內存不足的問題。
如果強引用對象不使用時,需要 strongReference = null;從而使GC能夠回收

軟引用

內存空間不夠時,軟引用會被回收。
主要用來做緩存。

弱引用

弱引用與軟引用的區別在于:只具有弱引用的對象,擁有更短暫的生命周期。
在垃圾回收器線程掃描它所管轄的內存區域的過程中,一旦發現只具有弱引用的對象,不管當前內存空間足夠與否,都會回收它的內存。
不過,由于垃圾回收器是一個優先級很低的線程,因此不一定會很快發現那些只具有弱引用的對象。

弱引用一般用在容器里,如:WeakHashMap。如果有一個強引用指向弱引用,當強引用消失之后,這個弱引用就也應該會消失。
典型應用:ThreadLocal

虛引用

虛引用顧名思義,就是形同虛設,使用get也無法獲取到虛引用的值。與其他幾種引用都不同,虛引用并不會決定對象的生命周期。如果一個對象僅持有虛引用,那么它就和沒有任何引用一樣,在任何時候都可能被垃圾回收器回收。

虛引用與軟引用和弱引用的一個區別在于:
虛引用必須和引用隊列(ReferenceQueue)聯合使用。
當垃圾回收器準備回收一個對象時,如果發現它還有虛引用,就會在回收對象的內存之前,把這個虛引用加入到與之關聯的引用隊列中。

總結

以上是生活随笔為你收集整理的多线程与高并发(五):强软弱虚四种引用以及ThreadLocal的原理与源码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。