- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个回调想执行一次。为了争论起见,我们假设它看起来像这样:
final X once = new X(1);
Runnable r = new Runnable() {
@Override public void run() {
if (once.use())
doSomething();
}
}
其中 X 是一些具有以下行为的并发对象:
构造函数:X(int N) -- 分配 N 个使用许可
boolean use()
:如果至少有1个use permit,消费其中一个返回true。否则返回假。此操作对于多线程而言是原子的。
我知道我可以使用 java.util.concurrent.Semaphore为此,但我不需要它的阻塞/等待方面,我希望这是一次性使用的东西。
AtomicInteger 看起来不够,除非我做类似的事情
class NTimeUse {
final private AtomicInteger count;
public NTimeUse(int N) { this.count = new AtomicInteger(N); }
public boolean use() {
while (true)
{
int n = this.count.get();
if (n == 0)
return false;
if (this.count.compareAndSet(n, n-1))
return true;
}
}
我对 while 循环感到不安。
CountDownLatch 不会工作,因为 countDown() method没有返回值,不能通过 getCount() 自动执行。
我应该只使用 Semaphore 还是有更合适的类?
最佳答案
在单许可的情况下你可以使用AtomicBoolean
:
final AtomicBoolean once = new AtomicBoolean(true);
Runnable r = new Runnable() {
@Override public void run() {
if (once.getAndSet(false))
doSomething();
}
}
如果您需要很多许可,请使用带有compareAndSet()
的解决方案。不用担心循环,getAndIncrement()
在幕后以相同的方式工作。
关于java并发: lightweight nonblocking semaphore?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5395168/
IBM(请参阅源代码)阐述了 Java 1.5 java.util.concurrent 类的优点,该类提供非阻塞队列。 请在下面解释 NonBlockingCounter 的弱点/缺点。 publi
众所周知,某些阻塞调用,例如read和write将返回-1并将errno设置为EINTR,我们需要对此进行处理。 我的问题是:这是否适用于非阻塞调用,例如,将套接字设置为O_NONBLOCK? 由于我
我有一个使用非阻塞套接字运行的简单 TCP 服务器。 引用自 recv 的联机帮助页; When a stream socket peer has performed an orderly shutd
我无法理解任何数据结构如何“非阻塞”。 假设您正在创建一个“非阻塞”哈希表。在某些时候,您的散列表变得太满,因此您必须重新散列到一个更大的表中。 这意味着您需要分配内存,这是一种全局资源。所以看起来您
我有一个回调想执行一次。为了争论起见,我们假设它看起来像这样: final X once = new X(1); Runnable r = new Runnable() { @Override
我使用MPI非阻塞通信(MPI_Irecv, MP_Isend)来监控slaves的空闲状态,代码如下。 排名 0: int dest = -1; while( dest <= 0){ int
我正在努力在 epoll 和 kqueue 标志之间画一条平行线,特别是 EPOLLONESHOT EPOLLET EPOLLEXCLUSIVE 和 EV_CLEAR/EV_DISPATCH/EV_O
我正在尝试使用 O_NONBLOCK 模式创建命名管道,并在单独的线程中使用“SELECT”方法监听读取事件。当我在主线程中休眠一段时间后试图关闭程序时出现问题。我希望当使用 close 方法关闭命名
我是 Node 新手,并尝试了解 Node 的非阻塞性质。 在下图中,我创建了请求的高级图表。 据我了解,单个用户针对单个应用程序的所有进程都在单个线程上运行。 我想了解的是事件循环的逻辑如何适合该图
基于此question我想请教以下问题。假设阻塞 I/O 并且我有一段如下代码: byte[] data = new byte[10]; someInputStream.read(data) 此代码片
在 Ubuntu 16.04 服务器(内核 4.4.0-22)上,根据/var/log/syslog,与 Ubuntu 14.04 相比,初始化“随机:非阻塞池”需要 2-5 分钟: May 28 1
我是一名优秀的程序员,十分优秀!