`

多线程并发线程的读写锁

    博客分类:
  • java
阅读更多

/*
读写锁,读读不互斥,读写互斥,写写互斥
 互斥的放在同一个类中 */

import java.util.Random;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
 publicclass ReadWriteLockTest { 
   publicstaticvoid main(String[] args) {
      final Queue3 q3 = new Queue3();
      for(inti=0;i<3;i++)
      { 
        new Thread(){
           publicvoid run(){
              while(true){
                 q3.get();            
              }
           }
        }.start();
                      
        new Thread(){
           publicvoid run(){
              while(true){
                 q3.put(new Random().nextInt(10000));
              }
           }          
        }.start();
      }
   }
}
 
class Queue3{
   private Object data = null;//共享数据,只能有一个线程能写该数据,但可以有多个线程同时读该数据。
   ReadWriteLock rwl = new ReentrantReadWriteLock();
  
   publicvoid get(){
          rwl.readLock().lock();
      try{
        System.out.println(Thread.currentThread().getName() + " be ready to read data!");
        Thread.sleep((long)(Math.random()*1000));
        System.out.println(Thread.currentThread().getName() + "have read data :" + data);      
      }catch(InterruptedException e){
        e.printStackTrace();
      }finally{
        rwl.readLock().unlock();
      }
   }
  
   publicvoid put(Object data){
      rwl.writeLock().lock();
      try{
        System.out.println(Thread.currentThread().getName() + " be ready to write data!");            
        Thread.sleep((long)(Math.random()*1000));
        this.data = data;
        System.out.println(Thread.currentThread().getName() + " have write data: " + data);           
      }catch (InterruptedException e){
        e.printStackTrace();
      }finally{
        rwl.writeLock().unlock();
      }
   }
}



读写锁的cache
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class CacheDemo {
   private Map<String, Object> cache = new HashMap<String, Object>();
   public static void main(String[] args) {
 
   }
   private ReadWriteLock rwl = new ReentrantReadWriteLock();
   public  Object getData(String key){ 
      rwl.readLock().lock();
      Object value = null;
      try{
        value = cache.get(key);
        if(value == null){
           rwl.readLock( ).unlock();
           rwl.writeLock().lock(); 
           try{
              if(value==null){
                 value = "aaaa";//实际失去queryDB();
              }
           }finally{
              rwl.writeLock().unlock();
           }
           rwl.readLock().lock();
        }
      }finally{
        rwl.readLock().unlock();
      }
      return value;
   }
}


分享到:
评论

相关推荐

    C#使用读写锁三行代码简单解决多线程并发的问题

    本文通过三行代码展示了如何使用读写锁解决多线程并发写入文件的冲突。 读写锁的核心在于,它允许多个线程同时读取资源,但只允许一个线程写入资源。这样,当多个线程尝试写入时,只有一个线程能够获得写锁,其他...

    易语言线程安全之原子锁与读写锁

    在IT行业中,线程安全是多线程编程中的一个重要概念,确保多个线程并发执行时,数据的正确性和完整性不会受到影响。线程安全通常通过同步机制来实现,其中包括原子操作和锁机制。本文将深入探讨易语言中的原子锁与...

    C#解决SQlite并发异常问题的方法(使用读写锁)

    使用C#访问sqlite时,常会遇到多线程并发导致SQLITE数据库损坏的问题。 SQLite是文件级别的数据库,其锁也是文件级别的:多个线程可以同时读,但是同时只能有一个线程写。Android提供了SqliteOpenHelper类,加入Java...

    多线程并发技术

    在现代软件开发中,多线程并发技术是提高程序性能和响应速度的关键因素之一。随着计算机硬件的性能持续提升,程序也必须能够有效地利用多核处理器来实现真正的并行处理。JVM(Java虚拟机)作为Java应用程序的运行...

    python多线程同步之文件读写控制

    然后,在`file_lock.py`的2.1部分,展示了没有使用任何同步机制(即不加锁)的多线程读写文件。这会导致并发问题,如输出所示,数据被错误地读取和写入,因为多个线程可能同时访问文件,导致数据混乱。 为了修复这...

    C#多线程读写sqlite

    当多线程环境对SQLite进行读写操作时,可能会引发数据竞争和并发问题,因此必须采取适当的同步策略来确保数据的一致性和完整性。 标题"**C#多线程读写sqlite**"涉及的主要知识点包括: 1. **多线程编程**:C#中的`...

    用多线程实现串口读写数据以及文件的读写

    本教程聚焦于如何利用多线程实现串口(Serial Port)读写数据及文件的读写操作,这对于理解和开发高效通信系统至关重要。 首先,我们要理解什么是串口通信。串口通信是一种基于串行数据传输的通信方式,它通过一条...

    多线程并发处理数据的问题

    在IT行业中,多线程并发处理数据是一种常见的优化策略,特别是在大数据处理、网络服务和分布式系统中。通过并发,可以充分利用多核处理器的计算能力,提高程序执行效率,缩短任务的总体完成时间。本篇文章将深入探讨...

    多线程 高并发

    这里,我们主要探讨的是如何通过编写多线程并发程序来优化应用程序的性能,提高系统的处理能力。 首先,多线程是指在一个进程中同时执行多个线程。线程是操作系统调度的基本单位,它允许程序同时执行多个任务。多...

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

    例如,互斥锁适合保护简单的临界区,条件变量用于处理更复杂的同步需求,而读写锁则优化了大量并发读取的情况。同时,线程与信号的配合可以处理异步事件,增加程序的灵活性。在使用这些机制时,应根据具体需求选择...

    多线程并发服务器(毕业设计)

    在IT领域,多线程并发服务器是网络编程中的一个重要概念,尤其在高并发场景下,如网站、在线游戏和实时数据处理系统等。这个毕业设计的主题是“多线程并发服务器”,采用C++语言实现,这表明我们将在讨论中涵盖C++...

    多线程(22)读写锁分离模式1

    在多线程编程中,读写锁是一种优化并发访问共享资源效率的重要机制。读写锁分离模式允许多个读取操作并行执行,而写入操作则保持互斥,从而提高系统的整体性能。Java中提供了`java.util.concurrent.locks....

    C# 服务 多线程 XMl读写

    标题中的"C# 服务 多线程 XML读写"涵盖了几个关键的编程概念,下面将分别详细介绍这些知识点。 首先,让我们来谈谈"C#"。C#是微软开发的一种面向对象的编程语言,它广泛用于构建Windows应用程序、Web应用程序、游戏...

    多线程,高并发.zip

    在设计高并发系统时,还需要考虑线程安全的设计模式,如生产者消费者模型、读写锁策略以及双检锁/双重校验锁(DCL)等。理解这些模式有助于构建可伸缩、健壮的系统。 最后,性能监控和调优也是高并发系统开发的重要...

    多线程操作串口示例(带modbus

    总的来说,"多线程操作串口示例(带Modbus)"这个主题涵盖了并发编程、串口通信和工业通信协议等多个IT领域的知识点,对于从事相关开发的工程师来说,这是一个宝贵的参考资料。通过学习和理解这个示例,我们可以更好...

    Delphi XE10.2.3多线程大量读和少量写公共资源时,用原子自旋读写锁代替互斥锁提高效率

    对于一个高性能服务器在处理多数读取,少量写入的场景时,如果还是使用常规的互斥锁方式,显然就不明智了,这种读多写少的场景最适合使用读写锁方式,读取时不加锁,多线程并发读取,效率是最高的,要写入数据时堵塞...

    Netty多线程并发编程

    Netty多线程并发编程知识点总结 Netty多线程并发编程是指在Netty框架中使用多线程技术来实现高性能、高并发的网络编程。下面是关于Netty多线程并发编程的知识点总结: 一、 JAVA 内存模型与多线程编程 在Java中,...

    多线程通信读写文件

    在编程领域,多线程通信是提升程序效率和并发能力的重要技术。特别是在处理大量数据时,如读写文件,多线程可以同时执行不同的任务,从而显著提高整体性能。本项目着重探讨如何在多线程环境中实现安全有效的文件读写...

    多线程并发编程在Netty中的应用分析

    ### 多线程并发编程在Netty中的应用分析 #### JAVA内存模型与多线程编程 ##### 1.1. 硬件的发展和多任务处理 随着硬件技术的不断进步,尤其是多核处理器的普及及其成本的降低,现代操作系统几乎都具备了支持多...

Global site tag (gtag.js) - Google Analytics