在Java中,AtomicInteger compareAndSet()与synced关键字的性能如何?
我正在实现请求实例的FIFO队列(为了速度而预先分配的请求对象),并开始在add方法上使用“synced”关键字。该方法非常短(检查空间是否在固定大小的缓冲区中,然后向数组添加值)。使用visualVM,线程似乎比我喜欢的更频繁地阻塞(确切地说是“监视器”)。因此,我将代码转换为使用AtomicInteger值来跟踪当前大小,然后在while循环中使用compareAndSet()(如AtomicInteger在内部对增量AndGet()等方法所做的那样)。代码现在看起来更长了。
我想知道的是,使用同步和较短的代码与不使用synced关键字的较长代码相比,性能开销是多少(因此永远不应该在锁定上阻塞)。
下面是带有 sync 关键字的旧 get 方法:
public synchronized Request get()
{
if (head == tail)
{
return null;
}
Request r = requests[head];
head = (head + 1) % requests.length;
return r;
}
下面是没有 sync 关键字的新 get 方法:
public Request get()
{
while (true)
{
int current = size.get();
if (current <= 0)
{
return null;
}
if (size.compareAndSet(current, current - 1))
{
break;
}
}
while (true)
{
int current = head.get();
int nextHead = (current + 1) % requests.length;
if (head.compareAndSet(current, nextHead))
{
return requests[current];
}
}
}
我的猜测是,同步关键字更糟糕,因为锁定上有阻塞的风险(可能导致线程上下文切换等),即使代码更短。
谢谢!