我需要一个具有以下功能的信号量:
我编写了以下代码:
public class SimpleSemaphore
{
private int permits;
private AtomicLong counter = new AtomicLong();
SimpleSemaphore(int permits)
{
this.permits = permits;
}
boolean acquire()
{
if (counter.incrementAndGet() < permits)
{
return true;
}
else
{
counter.decrementAndGet();
return false;
}
}
void release()
{
counter.decrementAndGet();
}
}另一种选择是这个信号量:
public class EasySemaphore
{
private int permits;
private AtomicLong counter = new AtomicLong();
EasySemaphore(int permits)
{
this.permits = permits;
}
boolean acquire()
{
long index = counter.get();
if (index < permits)
{
if (counter.compareAndSet(index, index + 1))
{
return true;
}
}
return false;
}
void release()
{
counter.decrementAndGet();
}
}这两种实现-线程安全和正确吗?哪一个更好?你将如何完成这项任务?
发布于 2012-09-26 08:22:03
java.util.concurrent.Semaphore不是已经这么做了吗?
它有一个用于非阻塞获取的tryAcquire,并且它保持一个简单的剩余许可计数(同一个线程可以取出多个许可)。
发布于 2012-09-26 08:23:18
我想说的是,第二个更好,因为计数器永远不会更大,泰坦0(和它略高的效率)
我将使用一个循环,否则,当仍然存在许可时,可以使该方法失败。
public class EasySemaphore {
private final AtomicInteger counter;
EasySemaphore(int permits) {
counter = new AtomicInteger(permits);
}
boolean acquire() {
// highly unlikely to loop more than once.
while(true) {
int count = counter.get();
if (count <= 0) return false;
if (counter.compareAndSet(count, count -1))
return true;
}
}
void release() {
counter.incrementAndGet();
}
}https://stackoverflow.com/questions/12597407
复制相似问题