`

线程模型--读写模型(2)

 
阅读更多
上述代码只是一段示意代码。实际应用中,人们通常抽取出来一个专门的读写同步锁。
interface ReadWriteLock {
  … getReadLock();
  … releaseReadLock();
  … getWriteLock();
  … releaseWriteLock();
}

具体的实现原理也是类似的信号量同步机制。
class RWLock {
  … readers, writers;

  … synchronized … getReadLock() { // 相当于synchronized(this)
     …
     while( writers > 0 )
         this.wait();  // 这里我们把RWLock对象本身作为信号量
       readers++;
  }

  …synchronized … releaseReadLock(){ //相当于synchronized(this)
       readers--;
   this.notifyAll(); // // 这里我们把RWLock对象本身作为信号量
  }

  …synchronized … getWriteLock(){// 相当于synchronized(this)
     while( writers > 0  || readers > 0 )
         this.wait();  // 这里我们把RWLock对象本身作为信号量

       writers++;
  }
  …synchronized …  releaseWriteLock(){// 相当于synchronized(this)
       writers--;
       this.notifyAll(); // // 这里我们把RWLock对象本身作为信号量
  }
}

具体用法是
public static final RWLock lock = new RWLock();

… read() {
  lock.getReadLock();
  // 读取
  lock.releaseReadLock();
}

… write() {
  lock.getWriteLock();
  // 读取
  lock.releaseWriteLock();
}
分享到:
评论

相关推荐

    内存模型-多线程内存模型

    2. **内存模型与编译器优化**:在单线程环境下,编译器可以自由地重新排序指令以优化性能。然而,在多线程环境下,这种优化可能会导致不可预知的结果。例如,如果没有适当的内存屏障(memory barriers),编译器可能会...

    Java同步线程模型分析与改进

    ### Java同步线程模型分析与改进 #### 一、引言 随着软件系统变得越来越复杂,多线程编程成为提高程序性能和响应性的关键手段之一。Java作为一种广泛使用的编程语言,自诞生以来就内置了对多线程的支持。然而,...

    VC_sample.rar_XCRFA_XCRFAP_XCRMF-801 _vc读写器

    【标签】中的"xcrfa xcrfap xcrmf-801_ vc读写器"表明了这个项目的关键词,"xcrfa"和"xcrfap"可能是该读写器系列的不同型号或者特定功能的缩写,而"xcrmf-801"则是核心的读写器模型。"vc读写器"则直接指出了开发工具...

    linux下的多线程实例--生产者消费者

    ### Linux下的多线程实例——生产者消费者模型 在Linux环境下进行多线程编程时,一个常见的应用场景就是通过生产者消费者模型来管理线程间的通信和数据共享问题。本篇文章将详细解析一个基于Linux环境下的多线程...

    Android 线程 多线程 Multi-thread

    ### Android中的线程与多线程技术详解 在Android开发中,线程和多线程技术是实现应用程序高效运行的关键所在。本篇文章将详细介绍Android线程的基础...在实际开发中,应根据具体需求选择合适的线程模型和技术方案。

    20_来聊聊redis的线程模型吧?为啥单线程还能有很高的效率?.zip

    Redis是一款高性能的键值存储系统,它以其独特的单线程模型和高效的内存管理而闻名。在深入了解Redis的线程模型之前,我们先要明白一点:虽然Redis是单线程的,但它的性能并不低,反而在很多场景下表现出非常高的...

    02-VIP-Netty核心功能与线程模型精讲1

    总的来说,Netty 是一个强大且灵活的网络通信框架,通过其高效的线程模型、易于使用的 API 和丰富的功能,极大地降低了开发网络应用的复杂性,提高了系统的性能和可扩展性。无论是在微服务架构、游戏后端,还是...

    多线程服务器的几种常用模型

    多线程服务器通常用于处理大量的并发连接请求,通过合理的线程模型设计和有效的线程间同步机制,可以显著提高服务器的性能和稳定性。OLPT模型和线程池模型各有优势,应根据具体的应用场景选择合适的模型。此外,进程...

    java线程-Java内存模型

    2. 原子性问题:Java内存模型并不保证所有的操作都是原子性的。例如,`count += 1`这样的操作实际上包含读、加、写三个步骤,在多线程环境中,如果在这些步骤之间发生线程切换,可能会导致数据不一致。Java提供了...

    多线程实现生产者---消费者模型

    这种模型广泛应用于并发编程,例如网络服务器处理客户端请求,或者数据库系统处理读写操作等。 在"MultiThread"这个文件中,很可能包含了实现上述模型的源代码。通过分析和理解这段代码,我们可以更好地掌握多线程...

    MonetDB进程-线程模型.docx

    ### MonetDB 进程-线程模型详解 #### 一、MonetDB架构概览 MonetDB是一款高性能的列式存储数据库管理系统,其设计初衷是为了满足大规模数据分析的需求。MonetDB的核心特色之一在于其独特的进程-线程模型,这种模型...

    Java Nio实现React堆线程模型-netty首要知识

    Java Nio实现React堆线程模型是Netty框架的核心特性之一,它极大地提高了网络应用程序的性能和可扩展性。在深入探讨这个主题之前,我们首先需要理解Java NIO(非阻塞I/O)的基本概念。 Java NIO,全称为Non-...

    多线程-day02.docx

    在“多线程-day02”的学习资源中,我们深入探讨了Java内存模型以及多线程的特性与控制机制。 **Java内存模型** Java内存模型,也称为JVM内存模型,是Java程序员理解和掌握的基础知识,特别是在进行并发编程时。它...

    Netty核心精讲之Reactor线程模型源码分析.mp4

    在深入探讨Netty的Reactor线程模型源码之前,我们需要先理解Reactor模式的基本概念。 Reactor模式是一种设计模式,常用于处理并发I/O事件。在多路复用I/O(如epoll、kqueue)中,Reactor模式是关键组成部分,它负责...

    15-linux线程专题讲座-王保明.rar

    2. **Linux线程模型**: - Linux内核线程与用户级线程:Linux内核不直接支持用户级线程,而是通过内核线程来实现用户级线程的映射,即每个线程对应一个内核线程。 - N:1、1:1和M:N模型:N:1模型(如Linux)中多个...

    操作系统-创建多线程-读者写者

    2. **消费者线程** (`consumer` 函数): 当线程ID为奇数时创建。同样地,此线程也只打印出一条消息“`MyThreadfirst`”,然后返回0。 3. **主线程**: 在`main`函数中,创建了20个线程(10个生产者线程和10个消费者...

    行业分类-设备装置-一种文件读写方法及装置.zip

    理解I/O模型(同步、异步、阻塞、非阻塞)和缓冲技术能优化读写性能。 3. 文件操作API:在操作系统层面,文件读写通常通过特定的系统调用(如open, read, write, close等)来实现。熟悉这些API的使用对于开发高效...

    winsocket 5中IO模型-代码全攻略

    Select模型是最基础的I/O管理方式,它允许程序监视多个套接字,等待它们中的任意一个准备好读写操作。当有可用的事件时,`select`函数返回,这样程序可以决定接下来要执行的操作。这个模型简单且可移植,但当监控的...

Global site tag (gtag.js) - Google Analytics