当前位置: 首页 > 知识库问答 >
问题:

Unsafe的方法compareAndSwapObject机制

庾君博
2023-03-14
    private Node addWaiter(Node mode) {
        Node node = new Node(Thread.currentThread(), mode);
        // Try the fast path of enq; backup to full enq on failure
        Node pred = tail;
        if (pred != null) {
            node.prev = pred;
            if (compareAndSetTail(pred, node)) {
                pred.next = node;
                return node;
            }
        }
        enq(node);
        return node;
    }

所以我做了个测试。但这让我越来越困惑。

我终于找到compareandsettail调用compareandswapobject

所以我在不安全的包中测试compareandswapobject

    private static final long nameOffset;
    private String name="init-name";
    static Unsafe unsafe = reflectGetUnsafe();
    static {
        try {
            nameOffset = unsafe.objectFieldOffset
                    (AQSTest.class.getDeclaredField("name"));
        } catch (Exception ex) { throw new Error(ex); }
    }
    private static Unsafe reflectGetUnsafe() {
        try {
            Field field = Unsafe.class.getDeclaredField("theUnsafe");
            field.setAccessible(true);
            return (Unsafe) field.get(null);
        } catch (Exception e) {
            return null;
        }
    }
    @Test
    public void testUnsafe() {
        String preName = name;
        unsafe.compareAndSwapObject(this, nameOffset, preName, "new-name");
        System.out.println("preName:" + preName);
        System.out.println("name:" + name);
    }
preName:init-name
name:new-name

共有1个答案

傅穆冉
2023-03-14

compareandswapobject()的工作方式(可能)与您期望的不一样。这可能是因为名字有点混淆。

它实际上并不交换对象。它只通过检查name==prename来更改name,如果是,则只更新其值。总是有一个目标字段要更新,而不是两个。

顺便说一句,这里有一些用于unsafe类的好的非官方文档。你可以从中得到一些有用的信息。

 类似资料:
  • import "unsafe" unsafe包提供了一些跳过go语言类型安全限制的操作。 type ArbitraryType type Pointer func Sizeof(v ArbitraryType) uintptr func Alignof(v ArbitraryType) uintptr func Offsetof(v ArbitraryType) uintptr type Arbi

  • Rust的内存安全依赖于强大的类型系统和编译时检测,不过它并不能适应所有的场景。 首先,所有的编程语言都需要跟外部的“不安全”接口打交道,调用外部库等,在“安全”的Rust下是无法实现的; 其次,“安全”的Rust无法高效表示复杂的数据结构,特别是数据结构内部有各种指针互相引用的时候;再次, 事实上还存在着一些操作,这些操作是安全的,但不能通过编译器的验证。 因此在安全的Rust背后,还需要uns

  • 本章开始讲解 Rust 中的 Unsafe 部分。 Unsafe 原始指针

  • 我最近在研究java函数界面,想知道方法参考是如何在收集流方法上工作的。 在java留档上,收集方法得到3个参数:供应商、累加器和组合器。 ...这是示例代码。 所以,我的问题是: > 参数类型 正如您在上面的代码中看到的,收集方法接收Bi消费者接口作为累加器和组合器的参数。 但是,ArrayList::add和ArrayList::addAll方法只接受一个参数(不是“Bi”,而是“一元”!)。

  • 本文向大家介绍Go unsafe 包的使用详解,包括了Go unsafe 包的使用详解的使用技巧和注意事项,需要的朋友参考一下 unsafe包 golang是一种静态的强类型的语言,所有的类型都是不能随意转换的,Go语言是不允许两个指针类型进行转换的。go官方是不推荐使用unsafe的操作因为它是不安全的,它绕过了golang的内存安全原则,容易使你的程序出现莫名其妙的问题,不利于程序的扩展与维护

  • 4.5 正确的关机方法 OK!大概知道开机的方法,也知道基本的指令操作,而且还已经知道线上查询了,好累呦! 想去休息呢!那么如何关机呢?我想,很多朋友在DOS的年代已经有在玩计算机了! 在当时我们关掉DOS的系统时,常常是直接关掉电源开关,而 Windows 在你不爽的时候,按着电源开关四秒也可以关机!但是在Linux则相当的不建议这么做! Why?在 Windows (非 NT 主机系统) 系统