gpt4 book ai didi

java - 是否可以在用户代码中使用 Java Unsafe?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:22:09 24 4
gpt4 key购买 nike

我正在阅读 java.util.concurrent 包中的代码,我发现类 Unsafe(用于实现那些同步器)很有趣。我可能永远不会在任何实际代码中使用它,因为类名本身似乎不鼓励这样做,但出于好奇,我对这个类有 2 个问题。

1).这个类的单例访问器是这样的:

    public static Unsafe getUnsafe() {
Class cc = sun.reflect.Reflection.getCallerClass(2);
if (cc.getClassLoader() != null)
throw new SecurityException("Unsafe");
return theUnsafe;
}

因此,如果从用户代码调用此方法,它将抛出异常。如何解决这个问题? (可能是通过引导类加载器加载我自己的类?这可能吗?)

2).上面的代码假定 getClassLoader 将为 boostrap 类加载器加载的类返回 null。但是 Class#getClassLoader 的 javadoc 说“一些实现可能使用 null 来表示引导类加载器。”,这意味着这个假设没有保证。对于违反此假设的实现,Unsafe(以及依赖于它的 ReentrantLock 等各种类)不会完全无法工作吗?

谢谢!

最佳答案

How to work around this?

您可以像这样获得对类的访问权限(前提是安全管理器允许更改可访问性):

public static Unsafe getUnsafe() {
try {
Field f = Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
return (Unsafe)f.get(null);
} catch (Exception e) { /* ... */ }
}

For implementations that do violate this assumption, wouldn't Unsafe ... fail to work at all?

Unsafe 类的细节也是特定于实现的。没有理由期望这个特定的 Unsafe 能够与类加载器子系统的任何其他实现一起工作。

关于java - 是否可以在用户代码中使用 Java Unsafe?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10829281/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com