Java 无锁CAS混淆

Java 无锁CAS混淆,java,multicore,cas,lock-free,Java,Multicore,Cas,Lock Free,嘿,伙计们, 我正在阅读这些所谓的非阻塞技术,但我几乎没有疑问: 1) 无锁操作是使用原子操作执行的,那么这些原子操作是什么呢?我的意思是,在某种程度上,他们也需要一把锁,对吗?那么,这种无锁方法是否只为我们提供了更细粒度的锁定? 2) 他们说非阻塞列表,现在非阻塞列表应该是什么:如果多个线程同时插入,只有一个线程会成功,另一个线程会做一些其他的工作,对吗?但是如果其他线程除了插入一个节点之外别无选择,那么为什么它是非阻塞的呢?在前一个任务完成之前,它不会被阻止吗?? 3) 在java中,如

嘿,伙计们,
我正在阅读这些所谓的非阻塞技术,但我几乎没有疑问:

1) 无锁操作是使用原子操作执行的,那么这些原子操作是什么呢?我的意思是,在某种程度上,他们也需要一把锁,对吗?那么,这种无锁方法是否只为我们提供了更细粒度的锁定?
2) 他们说非阻塞列表,现在非阻塞列表应该是什么:如果多个线程同时插入,只有一个线程会成功,另一个线程会做一些其他的工作,对吗?但是如果其他线程除了插入一个节点之外别无选择,那么为什么它是非阻塞的呢?在前一个任务完成之前,它不会被阻止吗??
3) 在java中,如何实现原子操作?他们不是做了类似于同步布尔值的事情吗 既然他们正在获取锁,即同步部分,那么它是如何无锁的呢? 4) CAS通常用于实现原子操作。那么CA不允许在同一个对象上只进行一次操作,并停止(阻止)其他想要在同一对象上操作的操作吗? 抱歉这么多的疑问。。。 请澄清

编辑 当我有一个要更新的结构时会发生什么?它也有硬件支持吗?不对,所以语言不是在某种程度上获取锁以使这些结构操作原子化吗?
关于JAVA:有AtomicReference和AtomicReferenceFieldDupdater类,它们提供对对象(结构或任何类型的对象)的更新,因此我们可以从性能(我是指速度)方面对它们进行比较吗?两者都在tern中使用不安全的类,该类使用本机类

1) 无锁操作是使用原子操作执行的,那么这些原子操作是什么呢

例如,递增计数器包括

  • 读取当前值
  • 递增内存中的值
  • 回写更新后的值
  • 原子性意味着这些都是作为一个单一的、统一的、不可中断的变化发生的

    我的意思是,在某种程度上,他们也需要一把锁,对吗

    错。CAS背后的基本思想是执行上面的前两个步骤,然后在第三个步骤之前,他们检查值是否在这两个步骤之间发生了更改,如果是,则会失败。然后,可以稍后使用新值重试更改

    没有涉及经典的锁定,因为3个步骤本身都是原子的。第三个(比较和交换)操作是由现代处理器支持的,因此您可能会说它涉及寄存器级别的某种锁定(坦率地说,我不知道它是如何实现的),但无论如何,这与Java中通常所指的锁定不同

    CAS的好处是提高了性能,因为即使在当前JVM中改进了锁定性能,CAS仍然更便宜,特别是在争用的情况下(即当一个操作中多个线程发生冲突时)。在这种情况下,使用锁,一个或多个线程被挂起,一个新线程被引入上下文,这是一个非常昂贵的操作,即使它不涉及交换内存

    2) 他们说非封锁名单,现在非封锁名单应该是什么

    在这里,您可能会混淆两个不同的术语。非阻塞列表是指在插入/删除时不阻塞的列表,这通常意味着其大小没有边界(例如)。与此相反,例如具有固定最大大小的阻塞队列(例如),当达到其大小限制时,会阻塞额外的插入调用,直到有更多可用空间(在其他线程从队列中删除元素之后)


    使用无锁算法(如)实现线程安全的集合与非阻塞集合不同。

    这里是AtomicInteger中的一个简单无锁方法

    public final int getAndIncrement() {
        for (;;) {
            int current = get();
            int next = current + 1;
            if (compareAndSet(current, next))
                return current;
        }
    }
    
    您可以看到,它获取值,增加值,并执行compareAndSwap。如果compareAndSwap没有找到期望值,则表示另一个线程已更改了该值。因此,它会一次又一次地尝试,直到所有其他试图更改该值的线程都这样做。这是无锁的,因为没有使用锁,但不是无阻塞的,因为它可能需要多次重试(非常罕见)


    1) 无锁操作是使用原子操作执行的,那么这些原子操作是什么呢?我的意思是,在某种程度上,他们也需要一把锁,对吗?那么,这种无锁方法是否只为我们提供了更细粒度的锁定

    但是,锁是使用更基本的操作实现的。否则,您将需要一个锁来实现锁adnauseum。无锁方法使用原子操作,避免完全锁定

    2) 他们说非阻塞列表,现在非阻塞列表应该是什么:如果多个线程同时插入,只有一个线程会成功,另一个线程会做一些其他的工作,对吗

    如果它是线程安全的,那么它们都应该成功,一次一个

    但如果其他线程除了插入节点之外别无选择,那么它为什么是非阻塞的呢

    术语为“并发”。它仍然需要等待另一个线程完成,它使用无锁方法来完成这项工作

    在前一个任务完成之前,它不会被阻止吗

    3) 在java中,如何实现原子操作

    有一个执行原子操作的调用本机方法。您可以通过阅读代码看到这一点。;)从生成的本机代码来看,这些本机方法被转换为机器代码指令以提高性能(而不是真正的方法调用)

    他们不是做了一些类似于同步布尔运算的事情吗。。。。。既然他们正在获取锁,即同步部分,那么它是如何无锁的呢

    不,如果你读了代码,你会发现它没有

    4) CAS通常用于实现原子操作。那么,cas不允许在同一台计算机上只进行一次操作吗