【问题标题】:locking synchronization in java using reentrant lock使用可重入锁在java中锁定同步
【发布时间】:2013-12-06 13:46:42
【问题描述】:

我有一个使用可重入全局锁的 java 应用程序,但我遇到了这样的问题:

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

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

【问题讨论】:

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

标签: java multithreading concurrency


【解决方案1】:

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

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

因此,您可以为此条目设计一个加权函数并根据它或实现Comparable 对条目进行排序。

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

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

【讨论】:

    【解决方案2】:

    如果一个线程获得了锁其他线程不能继续,我们不能改变这种行为。 现在要解决您的问题,我想提出一些建议。

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

    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;
    
    }
    

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

    【讨论】:

      【解决方案3】:

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

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

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

      我给你的网址供你参考-> 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/

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-13
        • 1970-01-01
        • 2011-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多