首页 > 编程语言 >JUC并发编程学习笔记(八)读写锁

JUC并发编程学习笔记(八)读写锁

时间:2023-11-04 15:44:06浏览次数:42  
标签:JUC java String 读写 编程 写入 util key import

读写锁

ReadWriteLock

ReadWriteLock只存在一个实现类那就是ReentrantReadWriteLock,他可以对锁实现更加细粒化的控制

读的时候可以有多个阅读器线程同时参与,写的时候只希望写入线程是独占的

Demo:

package org.example.rw;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class ReadWriteLockDemo {
    /*
    * 读读 - 可以共存 (共享锁)
    * 读写 - 不能共存 (独占锁)
    * 写写 - 不能共存 (独占锁)
    * */

    public static void main(String[] args) {



        MyCache myCache = new MyCache();
//        写入:要求在写入时不能存在插队的情况,以防止写入时资源被抢占
        for (int i = 1; i <= 5; i++) {
            final int temp = i;
            new Thread(()->{
                myCache.put(""+temp,temp);
            },String.valueOf(i)).start();
        }
//        读取:可以插队抢占资源以实现资源的最大化利用
        for (int i = 1; i <= 5; i++) {
            final int temp = i;
            new Thread(()->{
                myCache.get(temp+"");
            },String.valueOf(i)).start();
        }
    }
}
class MyCache{
    private volatile Map<String,Object> cache = new HashMap<>();
    ReadWriteLock rwLock = new ReentrantReadWriteLock();
//    细粒化控制:写 - 只希望同一时间只有一条线程写入,写入完成后再进入下一位
    public void put(String key,Object value){
        rwLock.writeLock().lock();
        try {

            System.out.println(Thread.currentThread().getName()+":"+key+"开始写入");
            cache.put(key,value);
            System.out.println(Thread.currentThread().getName()+":"+key+"写入完成");
        }catch (Exception e){
            e.printStackTrace();
        }finally {

            rwLock.writeLock().unlock();

        }

    }
//    细粒化控制:读 - 所有人都可以读
    public Object get(String key){
        rwLock.readLock().lock();

        Object o = null;
        try {
            System.out.println(Thread.currentThread().getName()+":"+key+"开始读取");
            o = cache.get(key);

            System.out.println(Thread.currentThread().getName()+":"+key+"读取完成");
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            rwLock.readLock().unlock();

        }

        return o;
    }
}

标签:JUC,java,String,读写,编程,写入,util,key,import
From: https://www.cnblogs.com/nhgtx/p/17805996.html

相关文章

  • 实验3 C语言函数应用编程
    任务11#include<stdio.h>2#include<stdlib.h>3#include<time.h>4#include<windows.h>5#defineN8067voidprint_text(intline,intcol,chartext[]);8voidprint_spaces(intn);9voidprint_blank_lines(intn......
  • x86平台SIMD编程入门(3):浮点指令
    1、算术指令算术类型函数示例备注加_mm_add_sd、_mm256_add_ps减_mm_sub_sd、_mm256_sub_ps乘_mm_mul_sd、_mm256_mul_ps除_mm_div_sd、_mm256_div_ps平方根_mm_sqrt_sd、_mm256_sqrt_ps倒数_mm_rcp_ss、_mm_rcp_ps、_mm256_rcp_ps快速计算......
  • x86平台SIMD编程入门(2):通用指令
    1、重解释转换虽然128位的XMM寄存器在硬件上只是256位YMM寄存器的下半部分,但在C++中它们是不同的类型。有一些intrinsic函数可以将它们重新解释为不同的类型,如下表所示,行代表源类型,列代表目标类型。__m128__m128d__m128i__m256__m256d__m256d__m128=_mm_castps_......
  • x86平台SIMD编程入门(1):SIMD基础知识
    1、简介SIMD(SingleInstruction,MultipleData)是一种并行计算技术,它通过向量寄存器存储多个数据元素,并使用单条指令同时对这些数据元素进行处理,从而提高了计算效率。SIMD已被广泛应用于需要大量数据并行计算的领域,包括图像处理、视频编码、信号处理、科学计算等。许多现代处理......
  • 【教3妹学编程-算法题】117. 填充每个节点的下一个右侧节点指针 II
    2哥 :3妹,听说你昨天去面试了,怎么样啊?3妹:嗨,别提了,让我回去等通知,估计是没有通知了,还浪费我请了一天假。2哥 :你又请假了啊,你是怎么跟你那个严厉的老板请假的。3妹:我说我2哥生病了,嘿嘿~2哥:一猜就是说我生病了,自从你找工作,我这一年都病了十几回了……3妹:没办法,假不好请嘛,我尽快......
  • 教3妹学编程-算法题】2914. 使二进制字符串变美丽的最少修改次数
    3妹:呜呜,烦死了,脸上长了一个痘2哥 :不要在意这些细节嘛,不用管它,过两天自然不就好了。3妹:切,你不懂,影响这两天的心情哇。2哥 :我看你是不急着找工作了啊,工作那么辛苦,哪还有时间想这些啊。3妹:说到找工作,我又要去刷题了。2哥:我给你出一道关于美丽的题吧,让你的心情美丽美丽~ 1题目......
  • 【教3妹学编程-算法题】数组中两个数的最大异或值
    3妹:“太阳当空照,花儿对我笑,小鸟说早早早,你为什么背上炸药包”2哥 :3妹,什么事呀这么开心呀。3妹:2哥你看今天的天气多好啊,阳光明媚、万里无云、秋高气爽,适合秋游。2哥:是啊,都快立冬了,天气还是这么热。今年的冬天比以往来的要晚一些。3妹:晚来也是要来的,看天气预报下周要降温,估计没几......
  • UE4中的C++编程简介
    对官方文档的学习链接利用UE创建一个C++基类在编辑器中可以选择父类,根据这个父类我们可以创建一个基类用于后续的蓝图类制作。以Actor父类为例创建基类,其头文件会包含一个构造函数,一个Tick函数的重载和一个BeginPlay函数的重载。BeginPlay函数告诉Actor以可运行状态进入了游戏......
  • JUC并发编程学习笔记(七)常用的辅助类
    常用的辅助类CountDownLatch这是一个JUC计数器辅助类,计数器有加有减,这是减。使用方法packageorg.example.demo;importjava.util.concurrent.CountDownLatch;//线程计数器publicclassCountDownLatchDemo{publicstaticvoidmain(String[]args){Cou......
  • JUC并发编程学习笔记(六)Callable(简单)
    Callable(简单)callable接口和runnable接口类似,都是为了执行另外一条线程而设计的,区别是Runnable不会返回结果也不会抛出异常。1、可以有返回值2、可以抛出异常3、方法不同;run()/call();Runnable实现Runnable接口,重写run方法,无返回值//原线程classRunnableThreadimple......