线程同步工具(二)控制并发访问多个资源
声明:本文是《 Java 7 Concurrency Cookbook 》的第三章, 作者: Javier Fernández González 译者:郑玉婷
控制并发访问多个资源在并发访问资源的控制中,你学习了信号量(semaphores)的基本知识。
在上个指南,你实现了使用binary semaphores的例子。那种semaphores是用来保护访问一个共享资源的,或者说一个代码片段每次只能被一个线程执行。但是semaphores也可以用来保护多个资源的副本,也就是说当你有一个代码片段每次可以被多个线程执行。
在这个指南中,你将学习怎样使用semaphore来保护多个资源副本。你将实现的例子会有一个print queue但可以在3个不同的打印机上打印文件。
准备
指南中的例子是使用 Eclipse IDE 来实现的。如果你使用Eclipse 或者其他的IDE,例如NetBeans, 打开并创建一个新的java任务。实现在控制并发访问资源里描述的例子。
怎么做呢…
按照这些步骤来实现下面的例子:
//2. 接着,声明一个名为lockPrinters的Lock对象。将要使用这个对象来保护freePrinters array的访问。
//3. 修改类的构造函数并初始化新声明的对象们。freePrinters array 有3个元素,全部初始为真值。semaphore用3作为它的初始值。
//5. 首先,调用acquire()方法获得semaphore的访问。由于此方法会抛出 InterruptedException异常,所以必须加入处理它的代码。
System.out.printf("%s: PrintQueue: Printing a Job in Printer%d during %d seconds\n",Thread.currentThread().getName(), assignedPrinter,duration);
//8. 最后,调用release() 方法来解放semaphore并标记打印机为空闲,通过在对应的freePrinters array引索内分配真值。
//12. 然后,在freePrinters array内找到第一个真值并在一个变量中保存这个引索值。修改值为false,因为等会这个打印机就会被使用。
它是怎么工作的…
在例子中的PrintQueue类的关键是:Semaphore对象创建的构造方法是使用3作为参数的。这个例子中,前3个调用acquire() 方法的线程会获得临界区的访问权,其余的都会被阻塞 。当一个线程结束临界区的访问并解放semaphore时,另外的线程才可能获得访问权。
在这个临界区,线程获得被分配打印的打印机的引索值。例子的这部分让例子更真实,而且它没有使用任何与semaphores相关的代码。以下的裁图展示了这个例子的执行输出:
每个文档都被安排到第一个空闲的打印机打印。
更多…
The acquire(), acquireUninterruptibly(), tryAcquire(),和release()方法有一个外加的包含一个int参数的版本。这个参数表示 线程想要获取或者释放semaphore的许可数。也可以这样说,这个线程想要删除或者添加到semaphore的内部计数器的单位数量。在这个例子中acquire(), acquireUninterruptibly(), 和tryAcquire() 方法, 如果计数器的值小于许可值,那么线程就会被阻塞直到计数器到达或者大于许可值。
参见
第三章,线程同步应用:并发地访问资源的控制
第八章,同步应用的测试:修改Lock接口
第二章,基本线程同步:修改lock的公平性
文章转自 并发编程网-ifeve.com
【多线程与高并发】- 线程基础与状态 所谓线程就是操作系统(OS)能够进行运算调度的最小单位,是一个基本的CPU执行单元,也是执行程序流的最小单元。能够提高OS的并发性能,减小程序在并发执行时所付出的时空开销。线程是进程的一个实体,是被系统独立调度和分派的基本单位。
【多线程】基础 | 线程的状态 大家好,上一篇主要主要是对多线程的了解,以及对Thread的start方法,进行了源码的跟踪,今天我们主要来说一说其他的状态。
驱动开发:监控进程与线程对象操作 监控进程对象和线程对象操作,可以使用`ObRegisterCallbacks`这个内核回调函数,通过回调我们可以实现保护calc.exe进程不被关闭,具体操作从`OperationInformation- Object`获得进程或线程的对象,然后再回调中判断是否是计算器,如果是就直接去掉`TERMINATE_PROCESS`或`TERMINATE_THREAD`权限即可。
同一资源多线程并发访问时的完整性 同一资源多线程并发访问时的完整性,常用的同步方法是采用信号或加锁机制,确保资源在任意时刻至多被一个线程访问。Java语言在多线程编程上实现了完全对象化,提供了对同步机制的良好支持。 在Java中一共有四种方法支持同步,其中前三个是同步方法,一个是管道方法。
相关文章
- 线程同步工具(六)控制并发阶段性任务的改变
- 线程同步工具(一)控制并发访问资源
- CommunityToolkit.Mvvm8.1 IOC依赖注入控制反转(5)
- knockoutjs 静动态数据、行为绑定,计算属性及Sync同步更新 Value值更新事件控制
- Vue+Express实现登录状态权限控制
- knockoutjs 静动态数据、行为绑定,计算属性及Sync同步更新 Value值更新事件控制
- 【STM32H7教程】第43章 STM32H7的DMA应用之双缓冲控制任意IO和脉冲数控制
- Atitit.软件控件and仪表盘(23)--多媒体子系统--视频输出切换控制cvbs av s-video Ypbpr pal ntsc
- 【微搭低代码】JavaScript基础知识-循环和条件控制
- VB.net:VB.net编程语言学习之基于VB.net语言控制VS软件中的窗体(各种控件及其属性代码说明)的简介、案例应用(GUI界面设计代码案例)之详细攻略
- 【蓝桥杯单片机组第六届模拟题】— “简易温度采集与控制装置”设计任务书
- 输入与输出源语 管道 复制一个打开文件描述符 文件读 等待异步 I/O 请求 文件描述符控制 等待异步 I/O 请求 撤除文件描述符 输入和输出 一个文件的控制操作 文件同步 异步输入与输出
- 简单的权限控制
- LabVIEW编程LabVIEW控制Keithley 2400例程与相关资料
- 基于Verilog的按键控制LED灯
- 深入浅出matplotlib(97):控制曲线中间部分不连接
- 漫谈并发编程(二):java线程的创建与基本控制
- HTML CSS表格如何控制上下间距
- C++ 反汇编:流程控制与循环结构
- Java代理模式:如何优雅地控制对象访问?