Unsafe函數是什麼?

2021-03-02 小魚學代碼
title: Unsafe函數
categories: 並發
tags: 並發

Unsafe是什麼?

Java 無法直接訪問底層作業系統,而是通過本地(native)方法來訪問。不過儘管如此,JVM 還是開了一個後門,JDK 中有一個類 Unsafe,底層是使用C/C++寫的,它提供了硬體級別的原子操作。Unsafe為我們提供了訪問底層的機制,這種機制僅供java核心類庫使用,而不應該被普通用戶使用。

UnSafe的功能主要有:

Unsafe為什麼是不安全的?

因為官方不推薦使用,因為不安全,例如你使用unsafe創建一個超級大的數組,但是這個數組jvm是不管理的,只能你自己操作,容易oom,也不利於資源的回收.

Unsafe的實例怎麼獲取?

a. 在jdk8和之前如果獲得其單例對象是會拋出異常的,只能通過反射獲取,在jdk9及以後,可以通過getUnsafe靜態方法獲取

b. 我們知道 unsafe是提供給java核心內庫使用的,那麼我們如何獲取Unsafe的實例呢?當然是反射!

c. 代碼:

Field f = Unsafe.class.getDeclaredField("theUnsafe"); f.setAccessible(true);  Unsafe unsafe = (Unsafe) f.get(null);

講一講Unsafe中的CAS操作?

a. JUC中用到了大量的CAS,他們的底層其實都是採用Unsafe的CAS操作,

b. CAS(比較與交換,Compare and swap)是一種有名的無鎖算法,因為不需要加鎖,性能比加鎖搞。CAS是一個CPU指令。CAS還是一個樂觀鎖技術

c. CAS存在的問題:

i. 經典的ABA問題,危害有(以棧舉例),解決方案:版本號控制,有的數據結構在高位用郵戳標記;不重複使用節點引用,而是構建新的節點,ii. CAS常常搭配自旋一起使用,如果自選長時間不成功,循環時間長 開銷大

Unsafe的阻塞/喚醒操作?

a. LockSupport類中的park與unpark方法對unsafe中的park與unpark方法做了封裝,LockSupport類中有各種版本pack方法,但最終都調用了Unsafe.park()方法。

實例化類的六種方式?

a. 通過構造方法new一個對象

b. 通過Class實例一個類c. 通過發射實例化一個雷

d. 通過克隆

e. 通過反序列化

f. 通過Unsafe實例化一個類

相關焦點

  • 深度解密Go語言之unsafe
    什麼是 unsafe前面所說的指針是類型安全的,但它有很多限制。Go 還有非類型安全的指針,這就是 unsafe 包提供的 unsafe.Pointer。在某些情況下,它會使代碼更高效,當然,也更危險。unsafe 包用於 Go 編譯器,在編譯階段使用。從名字就可以看出來,它是不安全的,官方並不建議使用。
  • 硬核解讀:為什麼Rust的Unsafe關鍵字有效?
    該函數返回一個字符串。現在,有同事修改了這個函數,它返回在運行時生成的名稱。藉助編程的魔力,我不需要更改對get_name的任何調用!函數籤名沒有變!更重要的是,揭穿我最討厭聽到的對立觀點:當然,Rust 是「安全的」,但提供了unsafe關鍵字,而且大多數標準庫都是unsafe的!我們需要討論兩件事:封裝和局部性。我相信,如果你了解面向對象編程,那麼你一定聽說過封裝。如果沒有,也沒關係。封裝是將數據隱藏在更大的分組中,只通過方法提供訪問。
  • 【厚積薄發】開啟Allow unsafe code的影響
    UWA 問答社區:answer.uwa4d.comUWA QQ群2:793972859(原群已滿員)本期目錄:Q:最近項目引進幾個插件,以及學習別人的插件,代碼中用到了unsafe關鍵字,需要再project settings中勾選Allow unsafe
  • Java中的Unsafe
    且構造函數是private的:public final class Unsafe { private static final Unsafe theUnsafe; public static final int INVALID_FIELD_OFFSET = -1; private static native void registerNatives
  • 簡述Unsafe使用
    = new Num(); System.err.println("new關鍵字創建: n=" + num1.getN()); Num num2 = Num.class.newInstance(); System.err.println("反射創建: n=" + num2.getN()); Unsafe unsafe
  • Costs of Unsafe Abortions
    A new study looked at the global cost of unsafe abortions, including the many women who are treated for complications of botched procedures.
  • Go語言中 Unsafe 的用法
    引入了 unsafe 的包可能依賴於 Go 實現的內部屬性。不過, Go 的一些標準庫中也在許多地方使用了 unsafe 包。Usage in Go with the reflection packageReflection 包是使用 unsafe 最多的包之一。Reflection 基於空接口包含的內部數據。
  • C++如何理解字符串複製函數strcpy
    1、字符串複製函數的函數原型為char* strcpy(char dest[ ],const char src[ ]);2、調用該函數時,該函數將字符數組src中的字符串複製到字符數組dest中去,並且覆蓋dest數組中的相應字符,返回指向dest的指針3、若編譯程序時出現
  • 「GCTT 出品」在 go 中如何調用私有函數(綁定隱藏的標識符)
    有時為了更好的組織代碼或者在其他包使用某些隱藏的函數時需要克服這種限制。用 go:linkname 導出在 runtime/proc.go 中一個函數的實現...netimport ( ... _ "unsafe" // For go:linkname)...// byteIndex is strings.IndexByte.
  • PWN:unsafe unlink
    how2heap 這個程序展示了怎樣利用 free 改寫全局指針 chunk0_ptr 達到任意內存寫的目的,即 unsafe unlink。先在 main 函數上設置一個斷點,然後單步走一下,走到第 13 行(不包括)上面說的那個檢查 fd/bk 指針是通過 chunk 頭部的相對地址來找的,我們可以用全局指針 chunk0_ptr 構造一個假的 chunk 來繞過。
  • 【java基礎】並發包unsafe類概述
    ,如果需要使用它,則需要利用反射:private static Unsafe getUnsafe(){ try { Field field = Unsafe.class.getDeclaredField("theUnsafe"); field.setAccessible(true); Unsafe unsafe
  • 阿里面試官:你了解Java Unsafe類嗎?
    但我們不能通過像Unsafe unsafe = new Unsafe()這種簡單的方式來實現Unsafe的實例化,這是由於Unsafe的構造方法是私有的。Unsafe有一個靜態的getUnsafe()方法,但是如果天真的以為調用該方法就可以的話,那你將遇到一個SecurityException異常,這是由於該方法只能在被信任的代碼中調用。
  • 深入理解go的函數參數傳遞
    首先我們要有一個理解:go的函數參數傳遞都是值傳遞,為什麼說是傳值呢?因為go的函數傳遞都是複製了一份傳遞到參數中。
  • 每天都在調用函數,Go 中函數調用的原理你知道嗎?
    函數是 Go 語言中的一等公民,理解和掌握函數的調用過程是深入學習 Golang 時無法跳過的步驟,這裡會介紹 Go 語言中函數調用的過程和實現原理並與 C 語言中函數執行的過程進行對比,同時對參數傳遞的原理進行剖析,讓讀者能夠清楚地知道 Go 在函數的執行過程中究竟都做了哪些工作。