以下的代码完成了对某个资源的读写互斥锁,具体说明如下:
1. 若正有若干进程在读资源,新的读进程可以共享资源;
1. 若正有若干进程在读资源,一条写进程想要独占资源,则写进程等待,到所有读进程全部完成之后控制资源;
2. 若正有一个进程在独占写资源,则所有其他进程等待,到这个进程完成之后,其他进程共享或独占资源。
换句话说就是,独占的进程必须等到所有共享进程完成操作之后才能执行;共享的进程也必须等到独占进程释放资源之后才能共享。
/**
* <pre>
* 文件名称:Lock.java
* 文件描述:读写锁
* 创建日期:2009-2-19
* </pre>
*
* @version 1.0
*/
package cn.sh.huang.util;
/**
* <pre>
* 类型名称:Lock
* 类型目的:读写锁,在某个或某些进程读数据的时候,屏蔽写操作,在某单独进程写数据的时候,屏蔽其它的读、写操作。
* 使用说明:
* for (Lock lock = lock.read(); lock != null; lock.done()) {
* ... // 在此方法体内的所有语句均被只读保护,在最后一个读进程完成之前,不允许写操作
* }
*
* for (Lock lock = lock.write(); lock != null; lock.done()) {
* ... // 此方法体内的所有语句均被只写保护,仅有一个进程能够执行,期间不允许其它进程的读写访问
* }
* </pre>
*/
public final class Lock
{
private static final int LOCK_READ = 1, LOCK_WRITE = 2;
private static Bolt reader = new Bolt(), writer = new Bolt();
private final int flag; // 0: UNKNOWN; 1: Reading...; 2: Writing...
private Lock(int flag)
{
this.flag = flag;
}
/**
* <pre>
* 方法说明:只读访问,可以多个进程并发读
* </pre>
*
* @return 返回当前的只读锁,在解锁的时候需要
*/
public static Lock read()
{
synchronized (writer) {
while (writer.exists())
try {
writer.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (reader) {
reader.inc();
}
}
return new Lock(LOCK_READ);
}
/**
* <pre>
* 方法说明:只写访问,只允许一个进程操作
* </pre>
*
* @return 返回当前的锁,以备解锁时候用
*/
public static Lock write()
{
synchronized (writer) { // 检查是否有写者
while (writer.exists())
try {
writer.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
writer.inc();
}
synchronized (reader) {
while (reader.exists())
// 检查是否有读者
try {
reader.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
return new Lock(LOCK_WRITE);
}
}
public Lock done() {
if (flag == LOCK_READ) return readDone();
else return writeDone(); // obviously
}
/**
* <pre>
* 方法说明:完成读操作,解锁
* </pre>
*
* @return 返回null,表明完成解锁
*/
private Lock readDone()
{
synchronized (reader) {
reader.dec();
reader.notifyAll();
}
return null;
}
/**
* <pre>
* 方法说明:完成写操作,解锁
* </pre>
*
* @return 返回null,表明完成解锁
*/
private Lock writeDone()
{
synchronized (writer) {
writer.dec();
writer.notifyAll();
}
return null;
}
static class Bolt
{
private int count = 0;
public boolean exists()
{
return count != 0;
}
public void inc()
{
count++;
}
public void dec()
{
count--;
}
}
}
分享到:
相关推荐
说明:编译时加上参数 -lrt -lpthread 要不然找不到库文件
主要介绍了python并发编程多进程 互斥锁原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
* 读写锁 * 读-读并发,读-写互斥,写-写互斥 * Windows NT下可以使用 * 基于CRITICAL_SECTION实现,简单高效,只支持在进程内使用,不支持进程间使用 * 支持限制最大并发读者数 * 写操作优先(即当前有线程...
我最常用的是互斥锁,也称独占锁。其次还有读写锁,信号量,条件变量等。 除此之外,我们在进程间通信时会用到信号,向某一个进程发送信号,该进程中设置信号处理函数,然后当该进程收到信号时,执行某些操作。 其实...
这个锁可以防止重复运行一个进程,例如在使用crontab时,限定每一分钟执行一个任务,但这个进程运行时间可能超过一分钟,如果不用进程锁解决冲突的话两个进程一起执行就会有问题。 使用PID文件锁还有一个好处,方便...
读写锁(读-读并发,读-写互斥,写-写互斥,基于CRITICAL_SECTION实现,简单高效,不支持进程间使用,写操作优先(即当前有线程在读,有写操作后,不允许再有新的读,直至写操作完成,避免写饿死))
其它的是读写模式 成功时,这个函数返回共享内存的起始地址。失败时返回-1。 char *head , *pos , head = pos = shmat( shmid , 0 , 0 ); // 允许本进程使用这块共享内存 shmdt()与shmat()相反,是用来禁止本...
主要有如何创建会话、信号的产生原因、信号处理方式、守护进程概念、线程的一些函数、互斥锁、读写锁的特点用法
本书从对Posix IPC和System V IPC的内部结构开始讨论,全面深入地介绍了4种IPC形式:消息传递(管道、FIFO、消息队列)、同步(互斥锁、条件变量、读写锁、文件与记录锁、信号量)、共享内存(匿名共享内存、具名...
本书从对Posix IPC和System V IPC的内部结构开始讨论,全面深入地介绍了4种IPC形式:消息传递(管道、FIFO、消息队列)、同步(互斥锁、条件变量、读写锁、文件与记录锁、信号量)、共享内存(匿名共享内存、具名...
8.4 使用互斥锁和条件变量实现读写锁 142 8.5 线程取消 148 8.6 小结 153 习题 153 第9章 记录上锁 154 9.1 概述 154 9.2 对比记录上锁与文件上锁 157 9.3 Posix fcntl记录上锁 158 9.4 劝告性上...
详细介绍了linux系统下编程环境及编程工具、文件管理(文件类型、ansi以及...进程间异步机制(信号)、线程管理(创建、退出、取消等以及属性控制)、线程间同步(互斥锁、读写锁、条件变量)以及网络基本编程、高级应用等内容...
详细介绍了linux系统下编程环境及编程工具、文件管理(文件类型、ansi以及...进程间异步机制(信号)、线程管理(创建、退出、取消等以及属性控制)、线程间同步(互斥锁、读写锁、条件变量)以及网络基本编程、高级应用等内容...
详细介绍了Linux系统下编程环境及编程工具、文件管理(文件类型、ANSI...进程间异步机制(信号)、线程管理(创建、退出、取消等以及属性控制)、线程间同步(互斥锁、读写锁、条件变量)以及网络基本编程、高级应用...
由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以。 效率: 采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息...