使用reentrant锁在java中锁定同步

时间:2013-12-06 13:46:43

标签: java multithreading concurrency

我在java中使用可重入全局锁的应用程序,我有这样的问题:

一个线程获取可重入的全局锁定,并且假设在这个时间间隔内保持锁定30秒它进行一些操作。在此时间间隔内,所有其他线程都被阻止。 我的问题是我希望像RMI这样的线程有机会执行。

为了让其他一些线程在短时间内获得锁定,有什么好的锁定策略或优化?

3 个答案:

答案 0 :(得分:2)

所以你基本上有一个应该在单线程环境中执行的作业队列。每次从此队列轮询之前,您需要按优先级对其条目进行排序。

abstract class JobEntry<V> implements Callable<V>{
    Date registeredAt;
    long runEstimationMs;
    JobType type;
}

因此,您可以为此条目提供称重功能,并根据它或实施Comparable对条目进行排序。

这几乎就是这样。您可以将这些作业发送到单个线程的固定线程池。如果您需要中断它们,则需要取消将来,每个作业都应该检查Thread.interrupted()州。

这里最困难的部分是称重功能,一种可能的构建方法可能是在你的系统上进行一系列实验。

答案 1 :(得分:0)

如果一个线程已获得锁定,则其他线程无法继续,我们无法更改此行为。 现在要解决你的问题,我想提出的建议很少。

尝试减少锁定范围,以便其他线程也有机会执行。 看看是否可以获得真正需要的部件的锁定并在此之后释放锁定的可能性。因为正如你所说,一个主题需要花费大量时间,所以代码的某些部分可能不需要锁定。

operationInLock(){
----
lock.lock();
Code where lock is required;
lock.unlock();

Code where lock is Not required;
Code where lock is Not required;
Code where lock is Not required;

lock.lock();
Code where lock is required;
lock.unlock();

Code where lock is Not required;
Code where lock is Not required;
Code where lock is Not required;

}

如果你觉得这个答案没什么用处,请给我们一些关于代码/功能的更多信息,因为如果没有看到代码就很难给出解决方案,我们可以根据最佳实践给出建议。

答案 2 :(得分:0)

我相信这可以通过第一个线程获取代码的特定部分来实现,该线程具有30秒的全局锁定,并且您还可以使用读取和写入java中的ReadWriteLock Object附带的单独锁定。 ReadWriteLock由java.util.concurrent.locks包中的ReentrantReadWriteLock类实现。多个线程可以获取多个读锁定,但只有一个线程可以获取互斥的写锁定。其他请求readLocks的线程必须等到写锁定被释放。允许线程从写锁定降级到读锁定,但反之亦然。允许读取线程升级会导致死锁,因为多个线程可以尝试升级其锁定。 ReentrantReadWriteLock还支持Reentrant锁的所有功能,例如提供公平机制,重入锁,条件支持(仅限写锁),允许读取中断以及写锁。

。 Condition对象(也称为条件变量)为线程提供了暂停其执行的能力,直到条件为真。 Condition对象必然绑定到Lock,并且可以使用newCondition()方法获得。

此外,条件通过使用Lock实现组合这些集合,可以实现每个对象具有多个等待集的效果。此外,由于条件访问在不同线程之间共享的状态部分,因此锁的使用是强制性的。值得一提的是,Condition必须以原子方式释放相关的Lock并暂停当前的线程执行。

供您参考我给你的网址 - &gt; https://examples.javacodegeeks.com/core-java/util/concurrent/locks-concurrent/condition/java-util-concurrent-locks-condition-example/

https://examples.javacodegeeks.com/core-java/util/concurrent/locks-concurrent/readwritelock/java-readwritelock-example/

如果您需要其他帮助,请告诉我