摘要:本身不直接支持指針的操作,所以這也是該類命名為的原因之一。中的許多方法,內部其實都是類在操作。
本文首發于一世流云的專欄:https://segmentfault.com/blog...一、Unsafe簡介
在正式的開講 juc-atomic框架系列之前,有必要先來了解下Java中的Unsafe類。
Unsafe類,來源于sun.misc包。該類封裝了許多類似指針操作,可以直接進行內存管理、操縱對象、阻塞/喚醒線程等操作。Java本身不直接支持指針的操作,所以這也是該類命名為Unsafe的原因之一。
J.U.C中的許多CAS方法,內部其實都是Unsafe類在操作。
比如AtomicBoolean的compareAndSet方法:
unsafe.compareAndSwapInt方法是個native方法。(如果對象中的字段值與期望值相等,則將字段值修改為x,然后返回true;否則返回false):
入參的含義如下:
參數名稱 | 含義 |
---|---|
o | 需要修改的對象 |
offset | 需要修改的字段到對象頭的偏移量(通過偏移量,可以快速定位修改的是哪個字段) |
expected | 期望值 |
x | 要設置的值 |
Unsafe類中CAS方法都是native方法,需要通過CAS原子指令完成。在講AQS時,里面有許多涉及CLH隊列的操作,其實就是通過Unsafe類完成的指針操作。
二、Unsafe對象的創建Unsafe是一個final類,不能被繼承,也沒有公共的構造器,只能通過工廠方法getUnsafe獲得Unsafe的單例。
但是getUnsafe方法限制了調用該方法的類的類加載器必須為Bootstrap ClassLoader。
Java中的類加載器可以大致劃分為以下三類:
類加載器名稱 | 作用 |
---|---|
Bootstrap類加載器(Bootstrap ClassLoader) | 主要加載的是JVM自身需要的類,這個類加載使用C++語言實現的,是JVM自身的一部分,它負責將 【JDK的安裝目錄】/lib路徑下的核心類庫,如rt.jar |
擴展類加載器(Extension ClassLoader) | 該加載器負責加載【JDK的安裝目錄】jrelibext目錄中的類庫,開發者可以直接使用該加載器 |
系統類加載器(Application ClassLoader) | 負責加載用戶類路徑(ClassPath)所指定的類,開發者可以直接使用該類加載器,也是默認的類加載器 |
所以在用戶代碼中直接調用getUnsafe方法,會拋出異常。因為用戶自定義的類一般都是由系統類加載器加載的。
但是,是否就真的沒有辦法獲取到Unsafe實例了呢?當然不是,要獲取Unsafe對象的方法很多,這里給出一種通過反射的方法:
Field f = Unsafe.class.getDeclaredField("theUnsafe"); f.setAccessible(true); Unsafe unsafe = (Unsafe) f.get(null);
但是,除非對Unsafe的實現非常清楚,否則應盡量避免直接使用Unsafe來進行操作。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/76542.html
摘要:注意原子數組并不是說可以讓線程以原子方式一次性地操作數組中所有元素的數組。類的方法返回指定類型數組的元素所占用的字節數。,是將轉換為進制,然后從左往右數連續的個數。 showImg(https://segmentfault.com/img/remote/1460000016012145); 本文首發于一世流云的專欄:https://segmentfault.com/blog... 一...
摘要:整個包,按照功能可以大致劃分如下鎖框架原子類框架同步器框架集合框架執行器框架本系列將按上述順序分析,分析所基于的源碼為。后,根據一系列常見的多線程設計模式,設計了并發包,其中包下提供了一系列基礎的鎖工具,用以對等進行補充增強。 showImg(https://segmentfault.com/img/remote/1460000016012623); 本文首發于一世流云專欄:https...
摘要:顧名思義,是類型的線程安全原子類,可以在應用程序中以原子的方式更新值。創建對象先來看下對象的創建。也就是說當一個線程修改一個共享變量時,其它線程能立即讀到這個修改的值。 showImg(https://segmentfault.com/img/remote/1460000016012210); 本文首發于一世流云的專欄:https://segmentfault.com/blog... ...
摘要:所謂,就是可以以一種線程安全的方式操作非線程安全對象的某些字段。我們來對上述代碼進行改造賬戶類改造引入通過操作字段調用方,并未做任何改變上述代碼,無論執行多少次,最終結果都是,因為這回是線程安全的。這也是整個包的設計理念之一。 showImg(https://segmentfault.com/img/remote/1460000016012109); 本文首發于一世流云的專欄:http...
摘要:在并發量較低的環境下,線程沖突的概率比較小,自旋的次數不會很多。比如有三個,每個線程對增加。的核心方法還是通過例子來看假設現在有一個對象,四個線程同時對進行累加操作。 showImg(https://segmentfault.com/img/remote/1460000016012084); 本文首發于一世流云的專欄:https://segmentfault.com/blog... ...
閱讀 1368·2021-09-13 10:25
閱讀 552·2019-08-30 15:53
閱讀 2265·2019-08-30 15:44
閱讀 2026·2019-08-29 17:20
閱讀 1594·2019-08-29 16:36
閱讀 1795·2019-08-29 14:10
閱讀 1785·2019-08-29 12:44
閱讀 1168·2019-08-23 14:13