`
regular
  • 浏览: 78168 次
  • 性别: 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无亲缘关系间进程同步通信实现(互斥锁+条件变量+共享内存模式)

    - 客户端连接共享内存,获取互斥锁,读写数据,然后释放锁。 - 当数据满足特定条件时,服务端或客户端可以发送信号量通知对方,通过条件变量进行同步。 5. **应用实例**: 在数据库、网络服务器、分布式系统等多...

    多进程互斥读写XML文件

    多进程互斥读写XML文件是一个需要谨慎处理的问题,合理使用互斥锁或其他同步机制,结合操作系统提供的文件锁功能,可以有效地避免并发访问导致的数据错误。在实际开发中,还需要根据具体应用场景权衡性能和安全性,...

    Python 进程互斥锁 Lock - Python零基础入门教程.pdf

    在Python编程中,进程互斥锁(Lock)是用于解决多进程并发访问共享资源问题的重要工具,确保在任何时刻只有一个进程能够访问...在处理多进程对文件或数据库等共享资源的读写操作时,务必使用进程互斥锁来确保数据安全。

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

    本示例中提到的“linux无亲缘关系进程间通信”着重讲解了如何利用互斥锁(Mutex)、条件变量(Condition Variable)以及共享内存(Shared Memory)这三种机制来实现非父子进程间的同步通信。 1. **互斥锁**:互斥锁...

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

    在进行Python并发编程的过程中,多进程与互斥锁是两个非常重要的概念。本文将详细解析Python多进程并发编程中互斥锁的原理和应用,通过具体的代码示例来进行说明。 首先,需要了解的是,在Python中,多进程是指创建...

    多进程写sqlite互斥解决方案代码

    对于多进程环境,可以使用操作系统的互斥锁,例如在Unix/Linux系统中的`fcntl`函数进行文件锁操作,或者使用`pthread_mutex_t`在进程间共享内存区域实现互斥。在Python中,可以使用`multiprocessing.Lock()`来实现跨...

    互斥锁的消息队列,很综合的程序源码

    在这个源码中,很可能使用了互斥锁来保护消息队列的读写操作,确保在任何时候只有一个线程可以对队列进行操作,防止数据的混乱。同时,通过条件变量(Condition Variables),线程可以在特定条件满足时(例如,消息...

    各种锁汇总,乐观锁、悲观锁、分布式锁、可重入锁、互斥锁、读写锁、分段锁、类锁、行级锁等

    本文将深入探讨标题和描述中提及的各种锁,包括乐观锁、悲观锁、分布式锁、可重入锁、互斥锁、读写锁、分段锁、类锁以及行级锁。 1. **乐观锁**:乐观锁假设多线程环境中的冲突较少,所以在读取数据时不加锁,只有...

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

    关于互斥锁和读写锁,它们在多线程编程中尤其重要,可以在进程级别上避免资源冲突。互斥锁(Mutex)确保同一时间只有一个线程可以访问某个资源。而读写锁(也称为共享-独占锁或共享互斥锁)则允许多个线程同时读取...

    操作系统课设-进程互斥与调度

    首先,进程互斥是确保同一时刻只有一个进程访问共享资源的一种机制。在给出的实验中,学生使用了`lockf()`函数来实现这一目标。`lockf()`是Linux系统提供的一个文件锁定函数,它允许进程对文件或文件区域进行锁定,...

    在分布式环境中Leader选举互斥锁和读写锁该如何实现

    互斥锁(Mutex)是一种常用的同步机制,用于保护共享资源免受多个并发线程或进程的干扰。在分布式系统中,互斥锁的实现更为复杂,因为需要考虑到网络延迟、节点故障等问题。 **2.1 实现原理** 在基于etcd的系统中...

    FileLock进程互斥

    在多线程或多进程编程中,进程互斥是一种重要的同步机制,确保同一时间只有一个进程访问共享资源,以防止数据不一致性和竞态条件的发生。在Java中,`FileLock`类提供了一种方法来实现对文件的独占式锁定,从而达到...

    Linux C++多进程同步锁内存共享【源代码】

    无亲缘关系多进程,使用互斥同步锁实现内存共享。

    WINDOWS读写锁实现

    在Windows操作系统中,读写锁(Read-Write Lock)是一种多线程同步原语,它允许多个线程同时读取共享资源,但在写入时仅允许一个线程访问。这提高了并发性能,尤其是在读操作远多于写操作的场景下。本篇文章将深入...

    线程间同步机制 读写锁通信机制 线程与信号

    在Linux高级程序设计中,主要介绍了三种线程同步机制:互斥锁、条件变量和读写锁,以及线程与信号的交互。 1. **互斥锁通信机制**: 互斥锁是用于保护临界区的一种机制,确保同一时间只有一个线程能访问共享资源。...

    信号量、互斥体和自旋锁的区别

    它实际上是一种简单的互斥锁实现方式,其内部维护了一个整数值,当该值为1时,表示资源未被占用;当值为0时,表示资源已被占用。 - **多值信号量**则适用于更复杂的同步需求。它可以同时管理多个资源的访问权限,每...

    C语言信号量同步与互斥生产者消费者互斥锁读写者问题哲学家就餐问题课程设计

    C语言信号量同步与互斥生产者消费者互斥锁读写者问题哲学家就餐问题课程设计 本课程设计旨在通过C语言编程来解决信号量机制下的同步、互斥、生产者消费者问题、哲学家就餐问题和读写者问题。 一、信号量机制 信号...

    jincheng.rar_进程同步互斥

    `jincheng.c`可能包含了对互斥锁的使用,确保在处理敏感数据或执行临界区代码时,只有一个进程能进入。 `www.pudn.com.txt`可能是作者在开发过程中参考的一些资料或者问题的记录,可能包含了对同步互斥问题的讨论,...

Global site tag (gtag.js) - Google Analytics