`
regular
  • 浏览: 75956 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

读写进程的互斥锁

    博客分类:
  • Java
 
阅读更多

以下的代码完成了对某个资源的读写互斥锁,具体说明如下:
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--;
        }
    }
}

 

分享到:
评论
2 楼 regular 2009-03-17  
ReentrantReadWriteLock
云中苍月 写道

建议楼主学习一下JDK1.5的ReentrantReadWriteLock

Sorry, 我的项目开发目前还没办法升级到Java 5。因此才自力更生。
不过我会看一下上面提到的锁的源代码,看看是否与我的设计有差异。
1 楼 云中苍月 2009-03-16  
建议楼主学习一下JDK1.5的ReentrantReadWriteLock

相关推荐

    linux无亲缘关系间进程同步通信实现(互斥锁+条件变量+共享内存模式)

    说明:编译时加上参数 -lrt -lpthread 要不然找不到库文件

    python并发编程多进程 互斥锁原理解析

    主要介绍了python并发编程多进程 互斥锁原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    C++的线程读写锁(windows实现)

    * 读写锁 * 读-读并发,读-写互斥,写-写互斥 * Windows NT下可以使用 * 基于CRITICAL_SECTION实现,简单高效,只支持在进程内使用,不支持进程间使用 * 支持限制最大并发读者数 * 写操作优先(即当前有线程...

    Python简单进程锁代码实例

    我最常用的是互斥锁,也称独占锁。其次还有读写锁,信号量,条件变量等。 除此之外,我们在进程间通信时会用到信号,向某一个进程发送信号,该进程中设置信号处理函数,然后当该进程收到信号时,执行某些操作。 其实...

    PHP程序中的文件锁、互斥锁、读写锁使用技巧解析

    这个锁可以防止重复运行一个进程,例如在使用crontab时,限定每一分钟执行一个任务,但这个进程运行时间可能超过一分钟,如果不用进程锁解决冲突的话两个进程一起执行就会有问题。 使用PID文件锁还有一个好处,方便...

    读写锁(windows版,基于临界区实现,高效,简单)

    读写锁(读-读并发,读-写互斥,写-写互斥,基于CRITICAL_SECTION实现,简单高效,不支持进程间使用,写操作优先(即当前有线程在读,有写操作后,不允许再有新的读,直至写操作完成,避免写饿死))

    linux 共享内存浅析

    其它的是读写模式 成功时,这个函数返回共享内存的起始地址。失败时返回-1。 char *head , *pos , head = pos = shmat( shmid , 0 , 0 ); // 允许本进程使用这块共享内存 shmdt()与shmat()相反,是用来禁止本...

    进程线程的一些特点、信号、守护进程线程的一些锁、条件变量等知识

    主要有如何创建会话、信号的产生原因、信号处理方式、守护进程概念、线程的一些函数、互斥锁、读写锁的特点用法

    UNIX网络编程 第2卷 进程间通信

    本书从对Posix IPC和System V IPC的内部结构开始讨论,全面深入地介绍了4种IPC形式:消息传递(管道、FIFO、消息队列)、同步(互斥锁、条件变量、读写锁、文件与记录锁、信号量)、共享内存(匿名共享内存、具名...

    UNIX网络编程_卷2_进程间通信

    本书从对Posix IPC和System V IPC的内部结构开始讨论,全面深入地介绍了4种IPC形式:消息传递(管道、FIFO、消息队列)、同步(互斥锁、条件变量、读写锁、文件与记录锁、信号量)、共享内存(匿名共享内存、具名...

    UNIX网络编程 卷2:进程间通信

     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高级程序设计(中文第二版)杨宗德 (1)

    详细介绍了linux系统下编程环境及编程工具、文件管理(文件类型、ansi以及...进程间异步机制(信号)、线程管理(创建、退出、取消等以及属性控制)、线程间同步(互斥锁、读写锁、条件变量)以及网络基本编程、高级应用等内容...

    LINUX高级程序设计(中文第二版)杨宗德 (2)end

    详细介绍了linux系统下编程环境及编程工具、文件管理(文件类型、ansi以及...进程间异步机制(信号)、线程管理(创建、退出、取消等以及属性控制)、线程间同步(互斥锁、读写锁、条件变量)以及网络基本编程、高级应用等内容...

    Linux高级程序设计 (不完整版只到11.5.2章节)

    详细介绍了Linux系统下编程环境及编程工具、文件管理(文件类型、ANSI...进程间异步机制(信号)、线程管理(创建、退出、取消等以及属性控制)、线程间同步(互斥锁、读写锁、条件变量)以及网络基本编程、高级应用...

    Linux共享内存实现机制的详解

    由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以。 效率: 采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息...

Global site tag (gtag.js) - Google Analytics