首页 > 编程语言 >并发编程之读写锁

并发编程之读写锁

时间:2024-07-04 22:56:45浏览次数:21  
标签:int lock 读写 编程 并发 static void new public

什么是读写锁?


非阻塞阻塞
阻塞阻塞

如果读操作频率远高于写操作,那读写锁就能大大提升系统性能

看两组对比例子:
先定义一个线程池,2000核心线程,4000最大线程,当所有线程执行结束之后,计算耗时

public class TestPoolExecutor extends ThreadPoolExecutor {
    private AtomicInteger count =new AtomicInteger(0);
    public long startTime=0;
    public TestPoolExecutor() {
        super(2000, 4000, 0, TimeUnit.SECONDS, new LinkedBlockingQueue<>());
    }

    protected void afterExecute(Runnable r, Throwable t) {
        int l=count.addAndGet(1);
        if(l==2000){
            System.out.println("用时:"+(System.currentTimeMillis()-startTime));
        }
    }
}

模拟多线程下读写,读操作1% 写操作99%,每次读写操作耗时1ms ,提交10000次读写任务,看看两者的性能差异

  • 使用ReentrantLock的情况下
public class TestReentrantLock {
	private static Lock lock=new ReentrantLock();
	static Random rand=new Random();

	private static int value;

	public static class ReadWriteThread implements Runnable{
		protected String name;

		public ReadWriteThread(){
		}


		@Override
		public void run() {
			try {
				read();
				int v=rand.nextInt(1000);
				if(v<10)
					write(v);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}


		public Object read() throws InterruptedException{
			try{
				lock.lock();
				Thread.sleep(1);
				return value;
			}finally{
				lock.unlock();
			}
		}

		public void write(int index) throws InterruptedException{
			try{
				lock.lock();
				Thread.sleep(1);
				value=index;
			}finally{
				lock.unlock();
			}
		}
	}

	public static void main(String[] args) {
		TestPoolExecutor exe=new TestPoolExecutor();

		long startTime=System.currentTimeMillis();
		exe.startTime=startTime;
		for(int i=0;i<10000;i++)
			exe.submit(new ReadWriteThread());
		try {
			Thread.sleep(20000);
		} catch (InterruptedException e) {
			throw new RuntimeException(e);
		}
	}

}

本人笔记本耗时为:3649ms

  • 使用ReentrantReadWriteLock
public class TestReadWriteLock {

    private static ReentrantReadWriteLock readWriteLock=new ReentrantReadWriteLock();
    private static Lock readLock = readWriteLock.readLock();
    private static Lock writeLock = readWriteLock.writeLock();
    static Random rand=new Random();

    private static int value;

    public static class ReadWriteThread implements Runnable{
        public ReadWriteThread(){
        }


        @Override
        public void run() {
            try {
                read();
                int v=rand.nextInt(1000);
                if(v<10)
                    write(v);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }


        public Object read() throws InterruptedException{
            try{
                readLock.lock();
                Thread.sleep(1);
                return value;
            }finally{
                readLock.unlock();
            }
        }

        public void write(int index) throws InterruptedException{
            try{
                writeLock.lock();
                Thread.sleep(1);
                value=index;
            }finally{
                writeLock.unlock();
            }
        }

    }

    public static void main(String[] args) {
        TestPoolExecutor exe=new TestPoolExecutor();

        exe.startTime=System.currentTimeMillis();
        for(int i=0;i<10000;i++)
            exe.submit(new ReadWriteThread());
        try {
            Thread.sleep(20000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

}

本人笔记本耗时为:174ms
对于读写锁而言,读操作越耗时,性能提升越明显,将读操作模拟耗时5ms,写操作不变
使用ReentrantLock本人笔记本耗时为:11554ms
TestReadWriteLock 只需要:197ms

标签:int,lock,读写,编程,并发,static,void,new,public
From: https://blog.csdn.net/z2802533142/article/details/140164282

相关文章

  • Spring MVC 中使用 RESTFul 编程风格
    1.SpringMVC中使用RESTFul编程风格@目录1.SpringMVC中使用RESTFul编程风格2.RESTFul编程风格2.1RESTFul是什么2.2RESTFul风格与传统方式对比3.SpringMVC中使用RESTFul编程风格(增删改查)的使用3.1准备工作3.2RESTFul风格的“查询”所有(RESTFul规范......
  • 存储读写之FLASH篇2-本篇内容来自野火文档
    STM32的内部FLASH简介在STM32芯片内部,存在一个重要的FLASH存储器,其主要用途是存储应用程序代码。编写完应用程序后,通常需要使用下载工具将已编译的代码文件写入内部FLASH。不可忽视的是,内部FLASH具有非易失性存储的特性,这意味着在断电后存储的数据不会丢失。每次芯片重新上......
  • 达梦数据库系列—20. 读写分离集群搭建
    目录一、配置读写分离集群1、环境说明2、数据准备3、配置主库GRP1_RWW_01配置dm.ini配置dmmal.ini配置dmarch.ini配置dmwatcher.ini启动主库设置OGUID修改数据库模式4、配置备库GRP1_RWW_02配置dm.ini配置dmmal.ini配置dmarch.ini配置dmwatcher.in......
  • “Java多线程编程:从Thread到Runnable再到Callable的深入探索“
    1什么是进程?通俗地解释为:计算机中正在执行的一个程序实例。进程它是系统分配资源的基本单位。想象一下,你的电脑就像是一个大工厂,而每一个进程就像是这个工厂里的一条生产线或者一个工作小组,它们各自独立地运行着不同的任务,但同时又受到整个工厂(即操作系统)的管理和调度。......
  • RESTful编程风格
    1、RESTFul是什么?RESTFul是WEB服务接口的一种设计风格。RESTFul定义了一组约束条件和规范,可以让WEB服务接口更加简洁、易于理解、易于扩展、安全可靠。在之前简单的讲解了一下RequestMapping注解结合占位符,结合RESTful风格编程是如何获取数据的。接下来我们将简单简介一下RESTful......
  • 深入探索Java IO与NIO:差异与高性能网络编程的应用
    深入探索JavaIO与NIO:差异与高性能网络编程的应用一、引言在Java中,I/O(Input/Output)操作是应用程序与外部世界交互的基本方式。Java标准库提供了多种I/O模型,其中最常用的有传统的I/O(即阻塞I/O)和新引入的NIO(Non-blockingI/O,非阻塞I/O)。随着网络应用的日益复杂和性能要求的......
  • 对谈 MoonBit:AI 时代的编程语言应该是什么样子的?丨编码人声
      「编码人声」是由「RTE开发者社区」策划的一档播客节目,关注行业发展变革、开发者职涯发展、技术突破以及创业创新,由开发者来分享开发者眼中的工作与生活。 本期节目,我们请到了MoonBit的创始人宏波和资深的开发者狼叔作为我们的嘉宾,一起和大家聊聊关于AI时代的编程语言......
  • 40个Python函数-助你快速成为编程高手
    40个Python函数-助你快速成为编程高手1、「len()」-返回对象的长度或项目数。length=len("Hello,World!")#返回132、「str()」-将对象转换成字符串。string_representation=str(123)#返回'123'3、「type()」-返回对象的类型。type_of_var=type......
  • SAP ABAP编程日记二报表的开发
    简介:本人是一个刚入行的学生,暂时担任ABAP开发工作。因为我之前没有接触过ABAP编程,对此比较陌生,所以此博客用于自己的学习记录,也希望给观看此博客的人提供一些帮助。上次我们创建了ABAP第一个程序,这次我们有针对性对于报表的开发进行学习一、编写之间的准备在编写程序的时候,......
  • 对于浏览器请求接口限制,是否有必要开发一套请求任务管理器组件,自主的去控制请求的并发
    在现代Web开发中,浏览器对同时发起的网络请求确实存在一定的限制,这个限制通常与浏览器的安全性和性能优化有关。不同浏览器对最大并发连接数有不同的默认设置,例如,Chrome和Firefox大致允许每个域名上同时有6到8个TCP连接,而IE可能更低。当超过这个限制时,额外的请求会被排队等待,直......