Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用可重入锁在java中锁定同步_Java_Multithreading_Concurrency - Fatal编程技术网

使用可重入锁在java中锁定同步

使用可重入锁在java中锁定同步,java,multithreading,concurrency,Java,Multithreading,Concurrency,我用java开发了一个使用可重入全局锁的应用程序,我遇到了如下问题: 一个线程获取可重入的全局锁,并在这个时间间隔内保持锁30秒,然后执行一些操作。在此时间间隔内,所有其他线程都被阻塞。 我的问题是,我希望像RMI这样的线程有机会执行 为了让其他线程在短时间内获得锁,什么是好的锁定策略或优化方法?因此,您基本上有一个作业队列,它应该在单线程环境中执行。每次在此队列中进行轮询之前,您都需要按优先级对其条目进行排序 abstract class JobEntry<V> implement

我用java开发了一个使用可重入全局锁的应用程序,我遇到了如下问题:

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


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

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

abstract class JobEntry<V> implements Callable<V>{
    Date registeredAt;
    long runEstimationMs;
    JobType type;
}
抽象类JobEntry实现可调用{
登记日期d;
长时间运行估计;
工作类型;
}
因此,您可以为该条目设置一个权重函数,并根据该函数或通过实现
Comparable
对条目进行排序

差不多就是这样了。您可以将这些作业发送到单个线程的固定线程池。如果需要中断它们,则需要取消以后的作业,并且每个作业都应检查
Thread.interrupted()
state


这里最困难的部分是权重函数,构建它的一种可能方法是在您的系统上进行一组实验。

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

尽量减少锁定范围,以便其他线程也有机会执行。 看看是否有可能获得真正需要的部件的锁,然后释放锁。因为正如您所说,一个线程占用了大量的时间,代码中的某些部分可能不需要锁定

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;

}

如果你觉得这个答案没用,请给我们提供更多关于代码/功能的信息,因为在看不到代码的情况下,很难给出解决方案,我们可以根据最佳实践为您提供建议。

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

。条件对象(也称为条件变量)使线程能够暂停其执行,直到条件为真。条件对象必须绑定到锁,并且可以使用newCondition()方法获得

此外,通过将每个对象具有多个等待集与锁实现的使用相结合,条件可以实现每个对象具有多个等待集的效果。此外,由于条件访问不同线程之间共享的状态部分,因此必须使用锁。必须指出的是,条件必须以原子方式释放关联的锁并挂起当前线程的执行

作为您的参考,我给您的网址->


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

共享代码以获得帮助。不要使用全局锁,只锁定您需要的资源。我无法摆脱全局锁,因为代码是遗留的。