【发布时间】:2020-11-10 17:43:18
【问题描述】:
public class SimulatedCAS {
private int value;
public synchronized int get() { return value; }
public synchronized int compareAndSwap(int expectedValue, int newValue)
{
int oldValue = value;
if (oldValue == expectedValue)
value = newValue;
return oldValue;
}
}
public class CasCounter
{
private SimulatedCAS value;
public int getValue()
{
return value.get();
}
public int increment()
{
int value.get();
while (v != value.compareAndSwap(v, v + 1))
{
v = value.get();
}
}
}
我参考了一本书《Java 并发实践》
一个计数器必须由多个线程增加。我尝试使用比较和交换方法,但最后它使用了同步关键字,这可能再次导致线程阻塞和等待。使用同步块为我提供了与任何人相同的性能。使用比较和交换和同步块有什么区别?或任何其他在不使用同步块的情况下实现比较和交换的方式。
【问题讨论】:
-
您可以使用
Unsafe.getUnsafe().compareAndSwapInt()来实现比较和交换。一般来说,CAS 比同步更有效。 -
为什么不直接使用
AtomicInteger呢?不需要自己做 -
不,我不能使用原子整数。这是我的任务@Lino-Votedon'tsayThanks
-
Unsafe.getUnsafe.compareAndSwapInt() 用于 AtomicInteger 类。它需要一个对象,并且需要很长时间……对吗? @weaver 与同步块有何不同
标签: java concurrency synchronization