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) 无锁操作是使用原子操作执行的,那么这些原子操作是什么呢 例如,递增计数器包括
使用无锁算法(如)实现线程安全的集合与非阻塞集合不同。这里是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不允许在同一台计算机上只进行一次操作吗