锁定免费的CAS混淆

pee*_*ush 0 java cas multicore lock-free

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

1)使用原子操作执行无锁操作,现在这些原子操作是什么?我的意思是在一定程度上他们还需要锁定吗?那么这种无锁方法是否只能让我们以更精细的粒度锁定?
2)他们说非阻塞列表,现在应该是一个非阻塞列表:如果同一个插入的多个线程出现,只有一个会成功,另一个会做其他工作吗?,但是如果除了插入一个节点,其他线程别无选择,那么它是如何进行非阻塞的呢?它不会被阻止,直到前一个完成?
3)在java中,它们如何进行原子操作?他们不是这样做的, synchronized boolean ..... 因为他们正在获取锁定即同步部分,它是如何无锁的?4)CAS通常用于实现原子操作.那么cas不允许在同一个对象上只发生一个操作,并停止(阻止)那些想要在同一个对象上操作的人吗?很抱歉这么多疑惑......请澄清......

编辑 当我有更新结构时会发生什么?它也受硬件支持吗?没有权利,那么语言是否会在某种程度上获取锁定以使这些结构操作成为原子?
关于JAVA:有AtomicReference和AtomicReferenceFieldUpdater类,它为对象(结构或任何类型的对象)提供更新,所以我们可以在性能方面比较它们,我的意思是速度吗?在tern中都使用了使用Native类的Unsafe类.

Pet*_*rey 5

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

public final int getAndIncrement() {
    for (;;) {
        int current = get();
        int next = current + 1;
        if (compareAndSet(current, next))
            return current;
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以看到它获取值,递增它并执行compareAndSwap.如果compareAndSwap找不到期望值,则表示另一个线程已更改该值.所以它再次尝试,直到尝试更改值的所有其他线程都这样做.这是免锁的,因为没有锁使用,但没有阻塞,因为它可能不得不再次尝试(这是罕见的)不止一次(非常罕见)


1)使用原子操作执行无锁操作,现在这些原子操作是什么?我的意思是在一定程度上他们还需要锁定吗?那么这种无锁方法是否只能让我们以更精细的粒度锁定?

但是,使用更原始的操作来实现锁.否则你需要一个锁来实现锁定adnauseum.无锁方法使用原子操作,避免完全锁定.

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

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

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

该术语是"并发".它仍然必须等待另一个线程完成,它使用无锁方法来执行此操作.

它不会被阻止,直到前一个完成?

是.

3)在java中,它们如何进行原子操作?

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

他们不会做像synchronized boolean .....这样它是如何锁定的,因为它们正在获取锁定即同步部分?

不,如果您阅读了代码,您会发现它没有.

4)CAS通常用于实现原子操作.所以cas不允许在同一个对象上发生一次操作,

没有.

并阻止(阻止)那些想要在同一个对象上操作的人?

没有.

再说一次,如果你看看它是如何使用的,它可能更有意义.

  • 如果您有要更新的结构,您仍然可以使用此方法.但是它可能会使代码复杂化.我建议您先尝试使用正常工作的应用程序,然后再查看优化方法.拥有复杂的数据结构非常罕见,需要这种级别的无锁方法.您是否意识到锁定通常需要1微秒?如果这是一个问题,通常最好的解决方案是构造线程,以便只有一个线程管理数据,完全不需要锁. (2认同)