Thread之ReentrantReadWriteLock

2024-01-01 15:38

本文主要是介绍Thread之ReentrantReadWriteLock,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

    • 前言
    • 读锁不互斥,可同时获得
      • 运行结果
    • 写锁互斥,不可同时获得
      • 结论


前言

在这里插入图片描述

读锁不互斥,可同时获得

import lombok.SneakyThrows;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/*** @author layman* @date 2021/2/9*/
public class Demo07 {public static void main(String[] args) {Demo07Service service = new Demo07Service();Demo07ThreadA t1 = new Demo07ThreadA(service);Demo07ThreadA t2 = new Demo07ThreadA(service);t1.setName("读线程01");t2.setName("读线程02");t1.start();t2.start();}
}
class Demo07Service{private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();public void read() throws InterruptedException {lock.readLock().lock();System.out.println(Thread.currentThread().getName()+" 获得读锁于:"+System.currentTimeMillis());Thread.sleep(1000L);System.out.println(Thread.currentThread().getName()+" 释放读锁于:"+System.currentTimeMillis());lock.readLock().unlock();}public void write() throws InterruptedException {lock.writeLock().lock();System.out.println(Thread.currentThread().getName()+" 获得写锁于:"+System.currentTimeMillis());Thread.sleep(1000L);System.out.println(Thread.currentThread().getName()+" 释放写锁于:"+System.currentTimeMillis());lock.writeLock().unlock();}
}
class Demo07ThreadA extends Thread{private Demo07Service service;public Demo07ThreadA(Demo07Service service){this.service = service;}@SneakyThrows@Overridepublic void run() {service.read();}
}
class Demo07ThreadB extends Thread{private Demo07Service service;public Demo07ThreadB(Demo07Service service){this.service = service;}@SneakyThrows@Overridepublic void run() {service.write();}
}

运行结果

在这里插入图片描述

写锁互斥,不可同时获得

t4.start();}
}
class Demo07Service{private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();public void read() throws InterruptedException {lock.readLock().lock();System.out.println(Thread.currentThread().getName()+" 获得读锁于:"+System.currentTimeMillis());Thread.sleep(1000L);System.out.println(Thread.currentThread().getName()+" 释放读锁于:"+System.currentTimeMillis());lock.readLock().unlock();}public void write() throws InterruptedException {lock.writeLock().lock();System.out.println(Thread.currentThread().getName()+" 获得写锁于:"+System.currentTimeMillis());Thread.sleep(1000L);System.out.println(Thread.currentThread().getName()+" 释放写锁于:"+System.currentTimeMillis());lock.writeLock().unlock();}
}
class Demo07ThreadA extends Thread{private Demo07Service service;public Demo07ThreadA(Demo07Service service){this.service = service;}@SneakyThrows@Overridepublic void run() {service.read();}
}
class Demo07ThreadB extends Thread{private Demo07Service service;public Demo07ThreadB(Demo07Service service){this.service = service;}@SneakyThrows@Overridepublic void run() {service.write();}
}

结论

  • 读写与写读都是互斥的,只要出现写操作,都是互斥的
  • 读读是共享的

这篇关于Thread之ReentrantReadWriteLock的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/559720

相关文章

Thread如何划分为Warp?

1 .Thread如何划分为Warp? https://jielahou.com/code/cuda/thread-to-warp.html  Thread Index和Thread ID之间有什么关系呢?(线程架构参考这里:CUDA C++ Programming Guide (nvidia.com)open in new window) 1维的Thread Index,其Thread

RT-Thread(Nano版本)的快速移植(基于NUCLEO-F446RE)

目录 概述 1 RT-Thread 1.1 RT-Thread的版本  1.2 认识Nano版本 2 STM32F446U上移植RT-Thread  2.1 STM32Cube创建工程 2.2 移植RT-Thread 2.2.1 安装RT-Thread Packet  2.2.2 加载RT-Thread 2.2.3 匹配相关接口 2.2.3.1 初次编译代码  2.2.3.

GTK中创建线程函数g_thread_new和g_thread_create的区别

使用GThread函数,需要引用glib.h头文件。 这两个接口的核心区别就是  g_thread_create 是旧的接口,现在已经不使用了,而g_thread_new是新的接口,建议使用。 g_thread_create: g_thread_create has been deprecated since version 2.32 and should not be used in n

基于 rt-thread的I2C操作EEPROM(AT24C02)

一、AT24C02 The AT24C01A/02/04/08A/16A provides 1024/2048/4096/8192/16384 bits of serial electrically erasable and programmable read-only memory (EEPROM) organized as 128/256/512/1024/2048 words of 8 b

[项目][CMP][Thread Cache]详细讲解

目录 1.设计&结构2.申请内存3.释放内存4.框架 1.设计&结构 Thread Cache是哈希桶结构,每个桶是一个按桶位置映射大小的内存块对象的自由链表 每个线程都会有一个Thread Cache对象,这样每个线程在这里获取对象和释放对象时是无锁的 TLS – Thread Local Strorage Linux gcc下TLSWindows vs下TLS

线程池工具类——Thread学习笔记

记录一下线程池工具类: /*** 线程池工具类* @author lixiang* @date 2018年10月10日 - 11:10* @history 2018年10月10日 - 11:10 lixiang create.*/public class ThreadPoolHelper {private static final Logger logger = LoggerFactory.g

模拟线程死锁——Thread学习笔记

记录一下之前写过的一段模拟死锁的代码: /*** 模拟死锁** @author lixiang* @date 2018年10月12日 - 9:51* @history 2018年10月12日 - 9:51 lixiang create.*/public class HoldLockDemo {private static Object[] lock = new Object[10];priv

C++11 Thread线程池、死锁、并发

一、线程与进程         进程:运行中的程序         线程:进程中的小进程 二、线程库的使用         包含头文件#include<thread> 2.1 thread函数         具体代码: void show(string str) {cout << "This is my word : " << str << endl;}int main() {t

Exception in thread main java.lang.NoClassDefFoundError: org/apache/juli/l

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/juli/l MyEclipse整合免安装版的Tomcat7,------> 看图吧 最后这个就可以在myeclipse里,使用你的tomcat,而不是用.bat打开!!!!

实现多线程有两种方法: Thread类继承和Runnable接口实现

l 创建线程的第一种方式:继承Thread类。 步骤: 1,定义类继承Thread。 2,复写Thread类中的run方法。 目的:将自定义代码存储在run方法。让线程运行。//run();仅仅是对象调用方法。而线程创建了,并没有运行。 3,调用线程的start方法, 该方法两个作用:启动线程,调用run方法。 Demo d = new Demo();//创建好一个线程