我有一个关键部分,我需要控制只有那些具有给定属性值的线程能够同时进入。
例如:我有Thread#1处理产品,Thread#2也处理产品,Thread#3处理服务
现在:
我认为这看起来很简单,但我找不到符合要求的东西。我的问题是,我怎样才能做到这一点?如能参考有关资料来源,将不胜感激。
先谢谢你
发布于 2016-08-27 12:08:42
这个怎么样:
private ConcurrentMap<Integer, Semaphore> semaphores = new ConcurrentHashMap<>();
public void enter(int id) {
Semaphore s = semaphores.computeIfAbsent(id, key -> new Semaphore(1));
try {
s.acquire();
// Critical section.
} catch (InterruptedException e) {
// Exception handling.
} finally {
s.release();
}
}tryEnter(int)通过Semaphore#tryAcquire()实现非阻塞的方法。发布于 2016-08-22 17:43:22
我认为您无法锁定值类型,但请尝试以下解决方法:将锁对象放入数组并从ID访问数组。
类似于:
private Object[] locks = new Object[] {new Object(), new Object()};
private void yourMethod(int id)
{
synchronized(locks[id]) //or id - 1 if you want to stick to your 1 and 2
{
//do your things
}
}希望它能帮上忙
发布于 2016-08-22 18:08:58
如果您确实需要这样的逻辑,则可以这样实现:
private final Lock lock = new Lock();
public void process() {
boolean locked = false;
if (isProduct()) { // Depends on the current thread
lock.lock();
locked = true;
}
try {
// Do the work here
} finally {
if (locked) {
lock.unlock();
}
}
}但这个问题本身就说明了一个糟糕的设计。只需创建方法processProduct()和processService(),创建第一个synchronized并从线程中调用您真正需要的方法。
https://stackoverflow.com/questions/39085565
复制相似问题