`

java-tryLock可轮询可中断可定时的锁

阅读更多

1、从JAVA5.0开始,提供了新的选择:ReentrantLock。

2、可定时和可轮询的锁获取模式由tryLock方法实现。

3、使用tryLock试图获得的锁如果不能同时获得,就回退,并重新尝试。休眠时间由一个特定组件管理。(下面的代码完成转帐)

public boolean transferMoney(Account fromAcct,AccounttoAcct,DollarAmonunt amount,long timeout,TimeUnit unit)

   throwsInsufficientFundsException,InterruptedException{

   longfixedDelay=getFixedDelayComponentNanos(timeout,unit);

   longrandMod=getRandomDelayModulusNanos(timeout,unit);

   longstopTime=System.nanoTime()+unit.toNanos(timeout);

 

   while (true){

      if (fromAcct.lock.tryLock()){

          try{

                 if(toAcct.lock.tryLock()){

                    try {

                           if (fromAcct.getBalance().compareTo(amount)<0)

                               thrownew  InsufficientFundsException();

                           else {

                                fromAcct.debit(amount);

                               toAcct.credit(amount);

                                returntrue;

                           }

                     }finally{toAcct.lock.unlock();}    

                }

          }finally{fromAcct.lock.unlock();}

      }

   }

   if(System.nanoTime()<stopTime) return false;

  NANOSECONDS.sleep(fixedDelay+rnd.nextLong()%randMod);
}

4、具有时间限制的活动,定时锁同样有用.超时后程序提前返回.

public boolean trySendOnSharedLine(String message,longtimeout,TimeUnit unit)

               throwsInterruptedException{

       longnanosToLock=unit.toNanos(timeout)-estimatedNanosToSend(message);

       if (!lock.tryLock(nanosToLock,NANOSECONDS)) return false;

       try{

             return sendOnSharedLine(message);

        }finally{lock.unlock();}

}

5、一个可中断的锁可以响应中断,能取消。

public boolean sendOnSharedLine(Stringmessage) 

      throws InterruptedException{

    lock.lockInterruptibly();

    try{

        return cancellableSendOnSharedLine(message);

    }finally{

        lock.unlock();

    }

}

private boolean cancellableSendOnSharedLine(String message)

    throwsInterruptedException{...}

}

 

http://deepfuture.iteye.com/blog/599557

分享到:
评论

相关推荐

    JAVA-基础多线程

    - `ReentrantLock`是Java 1.5之后引入的一个可中断、可轮询、可定时的锁。 - 示例代码: ```java private ReentrantLock lock = new ReentrantLock(); private Condition c1 = lock.newCondition(); private ...

    Java并发编程实践-电子书-07章.pdf

    使用`tryLock()`方法可以实现一种称为“可轮询”的锁请求模式。这种模式下,如果锁不可用,则线程不会被挂起,而是立即返回一个布尔值表示是否成功获取锁。如果锁未获取成功,则可以根据业务逻辑决定是否再次尝试...

    Java并发编程之显示锁ReentrantLock和ReadWriteLock读写锁

    - **可轮询和定时锁**: `tryLock()`方法使得线程在无法获取锁时可以选择立即返回,而不是一直阻塞,从而避免死锁。`tryLock(long time, TimeUnit unit)`允许设置超时时间,超时未获取到锁也会返回。 - **公平性**: ...

    22 到底哪把锁更适合你?—synchronized与ReentrantLock对比.pdf

    - `ReentrantLock`需要显式地调用`lock()`和`unlock()`方法来获取和释放锁,且建议使用`try-finally`结构确保锁的释放,以防止异常导致的锁未释放问题。 总的来说,如果`synchronized`能满足需求,应优先使用,...

    Java多线程中ReentrantLock与Condition详解

    * 实现可轮询的锁请求:通过tryLock()方法实现,仅在调用时锁为空闲状态才获取该锁。 * 实现可定时的锁请求:通过tryLock(long, TimeUnit)方法实现,在时间预算内设定相应的超时。 * 实现可中断的锁获取请求:通过...

Global site tag (gtag.js) - Google Analytics