java - 将 wait 和 notifyAll 代码转换为使用 Java 1.5 Lock 对象

标签 java multithreading concurrency thread-safety

我们使用的代码在包含大量 wait 和 notifyAll() 调用的代码段周围使用同步块(synchronized block)。我们正在尝试将它们转换为使用 Java 5 Lock.lock() 和 Lock.unlock() 方法。如何迁移此代码以删除所有 wait 和 notifyAll 调用。我不知道使用新的锁定功能与这些等效。

任何带有示例的链接将不胜感激。

提前致谢

等式,以下代码需要转换为使用 Lock.lock() 和 lock.unlock 删除同步块(synchronized block)的第一部分很简单,因为我只需要调用 lock() 方法。问题是可以为 notifyAll() 和 wait 方法做什么。

     synchronized( LOCK )
            {
                while( !Thread.interrupted() )
                {
                 try
                    {

                        working = runRules();

                        if( !working )
                            LOCK.notifyAll();

                        LOCK.wait( working ? shortTimeout : longTimeout );
                    }
                    catch( final InterruptedException e )
                    {
                        Package.log.info( "Thread was interrupted.  Exiting.", e );
                        return;
                    }
                }
            }

最佳答案

使用 Conditions provided by the java.util.concurrent.locks package :

 final Object monitor = ...

 ...

 synchronized (monitor) {

     while (!condition) monitor.wait();
     ... do something ...
 }

变成:

 final ReentrantLock lock = ...;
 final Condition cvar = lock.newCondition();

 ...

 lock.lock();

 try {

     while (!condition) cvar.await();
     ... do something ... 

 } finally {

     lock.unlock();
 }

信号方面非常相似:

 synchronized (monitor) {

      ... do something ...
      monitor.notify();
 }

变成:

 lock.lock();

 try {

     ... do something ...
     cvar.signalAll();

 } finally {

     lock.unlock();
 }

关于java - 将 wait 和 notifyAll 代码转换为使用 Java 1.5 Lock 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5875437/

相关文章:

java - aspectJ 切入点如何与动态选择器一起使用?

JavaFX loadSkinClass 失败

multithreading - AnonProc 完成后,TTask.Run(AnonProc) 中的闭包未释放

Java 并发数 : weird output

java - 内存不足的最快方法

java - JdbcTemplate 抛出异常

linux线程, sleep 在主要

java - 单生产者多消费者 Java

python - 如果没有 2 个线程访问同一个元素,我是否需要对 python 数组进行并发控制?

c# - 控制任务的实际并发性