`

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

分享到:
评论

相关推荐

    S7-200SMART Modbus轮询应用库(使用说明+库文件).zip

    S7-200SMART是西门子推出的一款小型PLC(可编程逻辑控制器),它在工业自动化领域广泛应用。Modbus则是一种开放的通信协议,允许不同设备之间进行数据交换。本篇文章将深入探讨S7-200SMART如何利用Modbus轮询技术...

    S7-200 SMART MODBUS轮询程序的示例及具体使用方法的解释说明.rar

    《S7-200 SMART MODBUS轮询程序详解与应用指南》 在工业自动化领域,西门子的S7-200 SMART系列PLC因其小巧、灵活、功能强大而受到广泛应用。MODBUS通信协议作为工业设备间通信的通用标准,使得不同厂商的设备能够...

    STM32CUBEIDE(9)----双ADC轮询模式扫描多个通道

    STM32CUBEIDE(9)----双ADC轮询模式扫描多个通道 CSDN文字教程:https://blog.csdn.net/qq_24312945/article/details/125747527 B站教学视频:https://www.bilibili.com/video/BV1ZB4y187h6

    S7-200PLC-Modbus RTU通信轮询-主站读写程序示例.rar

    标题中的"S7-200PLC-Modbus RTU通信轮询-主站读写程序示例"指的是使用Siemens S7-200系列的PLC通过Modbus RTU协议实现通信轮询功能的主站读写程序实例。在工业自动化系统中,S7-200 PLC是一款广泛应用的小型PLC,而...

    S7-300多站点轮询

    西门子plc300系列 cp341 多站点进行轮询 485

    usb4java-javax-1.3.0.tar_usb4java包_usb4java1.3.0_usb4java版本_

    2. **全面的API**:USB4Java提供了一套完整的Java API,涵盖了USB设备的所有功能,包括枚举设备、打开和关闭设备、读写数据、管理配置和接口、处理中断和块传输等。 3. **事件驱动模型**:通过使用异步事件处理机制...

    S7-200SMART-modbusRTU轮询程序(读轮询+写优先)附使用说明.zip

    因此,当写请求到来时,程序会中断当前的读轮询,优先处理写操作,然后再恢复读取任务。 为了充分利用这个轮询程序,你需要熟悉S7-200SMART的编程环境,如Step 7 Micro/WIN SMART软件。在该软件中,你可以编写、...

    S7-200-modbus-通讯轮询程序(1).doc

    S7-200 PLC(可编程逻辑控制器)是西门子的一款小型PLC,广泛应用在工业自动化领域。Modbus是一种通用的通信协议,使得不同厂商的设备能够相互通信。本文将详细介绍如何在S7-200 PLC上实现与Modbus通讯的轮询程序。 ...

    第11周1-第04章节-Python3.5-RabbitMQ消息分发轮询.mp4

    第11周1-第04章节-Python3.5-RabbitMQ消息分发轮询.mp4

    一个轮询的java案例

    标题中的“一个轮询的Java案例”提示我们这个话题与编程中的轮询机制有关,而描述则提供了一个有趣的比喻,用以解释轮询的过程。在这个比喻中,20个人代表了程序中的多个参与者,3包降落伞相当于有限的资源,每数到...

    西门子S7-1200PLC MODBUS通讯协议轮询的探讨.pdf

    对于通讯轮询时出现的异常,需要设计合适的检测机制,避免轮询过程出现中断或卡死。异常检测需要能够应对设备在启动时发送的非标准MODBUS报文,这些报文会导致PLC执行错误或者校验失败。 对于程序的扩展性,设计时...

    Python-Python实现的轮询和回调API包

    在Python编程中,轮询和回调是两种常见的异步编程技术,它们在处理网络请求、数据获取和事件驱动编程中发挥着重要作用。本项目“Python-Python实现的轮询和回调API包”提供了一个专门的Python包,旨在简化这类任务的...

    S7-200SMART-modbus轮询源程序(定时器+计数器方式).rar

    总的来说,这份资源对于学习和理解如何在S7-200SMART PLC中利用MODBUS通信和基本的定时、计数功能进行设备轮询非常有帮助。使用者可以通过查看和分析代码,深入理解MODBUS通信协议在实际应用中的实现细节,以及如何...

    YDOS-数组方式实现轮询时间片 最简单易学 的系统 基于ucosII 改写的简单任务调度实现 汇编代码有详细注释

    YDOS-数组方式实现轮询时间片 基于ucosII 的简单任务调度实现 ,有相同任务优先级下的轮询,每个任务优先级可以一样 这种实现方式不是官方的用任务控制空的双向链表实现的 YDOS 嗯,以我的名字命名的,来源于...

    电信设备-基于正和负轮询事件提供自适应轮询的通信系统和相关方法.zip

    相反,负轮询事件(也称为中断或异步事件)是当设备有新数据或服务请求时主动通知系统,这种方式更节省资源,但可能延迟响应时间。 自适应轮询技术结合了两者的优势,根据网络条件和设备状态动态调整轮询策略。系统...

    php版本-179上传-轮询服务+网站端.zip

    轮询服务是网络通信中一种常用的技术,它是指客户端周期性地向服务器发送请求,检查是否有新的数据或者状态更新。在海关跨境电商系统中,轮询服务可能用于实时获取进口货物的数据,如订单状态、物流信息等。轮询虽然...

    S7-200SMART-MODBUS轮询中实现插队或条件写入的具体方法(1).docx

    这种设计巧妙地结合了定时和条件判断,确保了读操作的正常轮询,同时允许写操作在满足特定条件时优先执行,提高了系统的灵活性和响应性。这种方法尤其适用于实时性要求较高的应用场景,比如设备状态改变需要立即响应...

    java-comet

    Java-Comet是一种在Java平台上实现的长轮询(Comet)技术,它主要用于实现实时Web通信。Comet技术允许服务器向客户端推送数据,而不仅仅是响应客户端的请求,这在构建实时应用如聊天室、股票报价、在线游戏等场景中...

    S7-200SMART进行MODBUS轮询卡死时重新开启轮询的具体方法.docx

    例如,设置T37的定时时间为3秒,如果在3秒内MB10的值始终未变,那么T37计时器将变为ON。当T37的触点闭合时,这表示已达到预设的超时时间,我们可以利用其上升沿信号来执行处理程序,如复位所有轮询标志位,同时置位M...

Global site tag (gtag.js) - Google Analytics