JUC学习笔记(5)—ReadWriteLockDemo

Java基础高级进阶篇之并发篇详解(详解篇四十六) 本文摘要: Java并发编程(JUC)知识点详解,包含14个核心主题:1.并发基础概念(并发/并行区别、进程/线程关系、线程生命周期与创建方式);2.Java内存模型(JMM)原理与三大特性(原子性、可见性、有序性);3.锁机制(synchronized、Lock接口实现类);4.原子操作与CAS原理;5.线程通信与同步工具(CountDownLatch等);6.线程池工作原理与使用;7.并发集合类;8.异步编程模式;9.ThreadLocal原理;10.JDK21虚拟线程特性;11.结构化并发;12.常见 阅读详情

一个线程写入,100个线程读取

import java.util.concurrent.locks.ReentrantReadWriteLock;


class MyQueue
{
	private Object obj;
	private ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();

	public void writeObj(Object obj)
	{
		rwLock.writeLock().lock();
		try 
		{
			this.obj = obj;
			System.out.println(Thread.currentThread().getName()+"\t"+obj);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			rwLock.writeLock().unlock();
		}
	}
	
	public void readObj()
	{
		rwLock.readLock().lock();
		try 
		{
			System.out.println(Thread.currentThread().getName()+"\t"+obj);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			rwLock.readLock().unlock();
		}
	}	
}


public class ReadWriteLockDemo
{
	public static void main(String[] args) throws InterruptedException
	{
		MyQueue q = new MyQueue();
		
		new Thread(() -> {
			q.writeObj("ClassName1018");
		}, "writeThread").start();
		
		Thread.sleep(100);
		
		for (int i = 1; i <=100; i++) 
		{
			new Thread(() -> {
				q.readObj();
			},String.valueOf(i)).start();
		}
		
	}
}

 

产业园区如何高效对接企业技术需求与高校科研成果?.docx 科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。 立即下载

相关推荐

上海市大数据中心笔试模拟试卷

为帮助考生熟悉上海市大数据中心笔试的题型、考点及答题逻辑,以下整理了一份的模拟试卷,涵盖大数据专业知识、行政职业能力测试(行测)、公共基础知识(含上海本地政策)三大核心模块,并附详细答案解析。

一叶之秋的博客 1815

java之juc

juc是java.util.current的简写,意思是并发编程。

梦想是很难很难的,所以先勇敢一点 604

TensorRT(C++)部署 Pytorch模型

众所周知,python训练pytorch模型得到.pt模型。但在实际项目应用中,特别是嵌入式端部署时,受限于语言、硬件算力等因素,往往需要优化部署,而tensorRT是最常用的一种方式。本文以yolov5的部署为例,说明模型部署在x86架构上的电脑端的流程。(部署在Arm架构的嵌入式端的流程类似)。

女神sha手的博客 5405

Java并发编程基础-ReentrantLock的机制

同步锁:   我们知道,锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源,在Lock接口出现之前,Java应用程序只能依靠synchronized关键字来实现同步锁的功能,在java5以后,增加了JUC的并发包且提供了Lock接口用来实现锁的功能,它提供了与synchroinzed关键字类似的同步功能,只是它比synchronized更灵活,能够...

吴振照 1018

CentOS7上装不了最新Chrome?别折腾依赖了,试试这个老版本安装法(附103.0.5060.24 beta下载地址)

本文提供了在CentOS7上安装兼容版Chrome的详细指南,解决了因GLIBC版本限制导致的最新版Chrome无法安装的问题。推荐使用Chrome 103.0.5060.24 beta版本,并附有下载地址和完整安装步骤,包括禁用自动更新和配套工具安装,确保系统稳定性和功能完整性。

weixin_29289821的博客 569

用户存续期价值评估(CLV) 一

用户存续期价值评估(CLV) 1 一. 定义 ​     用户存续期价值(Customer Lifetime Value),也可称为CLTV、LCV或者LTV,是企业对未来一个客户与其的关系所带来的净收益的预测。这个预测模型可以有不同水平的复杂度和精确度,从一个直观感觉到使用复杂的预测技术。CLV可以被简单理解为客户关系的价值,也就是未来由于与客户的关系所带...

weixin_43171270的博客 8026

【读写锁小总结】ReentrantReadWriteLock的Demo实现

在实际的业务场景中,线程去访问一个资源,都是需要很多线程需要共享读的,写的时候可以独占锁,所以JUC就衍生出来ReentrantReadWriteLock,读写锁。而ReentrantLock和Synchronized和lock都满足不了这个需求。 独占锁:指该锁一次只能被一个线程所持有。对ReentrantLock和Synchronized而言都是独占锁。 共享锁:指该锁可被多个线程所持有。 对ReentrantReadWriteLock,其读锁是共享锁,其写锁是独占锁。读锁的共享锁可保证并发读是非常高

Little Feel的博客 527

Go游戏服务器开发的一些思考(一):语言层面

Go是比C++更好用的高级语言使用Go作为服务器开发的主语言前,首先需要对Go语言做下定性。在接触Go前,可能给人的印象(至少是我),Go是一门脚本语言。看了 官方文档 ,才知道Go是一门高级语言。与C++相比,它有以下优势: 面向接口的编程没有C++复杂的面向对象语法,如类、继承、多态、虚函数等等。Go中只有结构与接口,从语言层面上,直接指导功能与功能间的解耦。直接且语法简单 提供语言反射机制提供

范安崇的博客 9560

系统CPU飙高和频繁GC问题查询思路

处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次数过多的问题。当然,这些问题的最终导致的直观现象就是系统运行缓慢,并且有大量的报警。本文主要针对系统运行缓慢这一问题,提供该问题的排查思路,从而定位出问题的代码点,进而提供解决该问题的思路。 对于线上系统突然产生的运行缓慢问题,如果该问题导致线上系统不可用,那么首先需要做的就是,导出jstack和内存信息,然后重启系统,尽快保证系统的可用性。这种情况可能的原因主要有两种: 代码中某个位置读取数据量较大,导致系统内存

java_kider的博客 717

绕过Cloudflare的两种简便方案

绕过Cloudflare的两种简便方案

自成背后的博客 1万+

【CAD二次开发】炸开所有的嵌套块

代码】【CAD二次开发】炸开所有的嵌套块。

1513

LockSupport

javadoc 用于创建锁和其他同步类的基本线程阻塞原语。 这个类与每个使用它的线程相关联,一个许可证(在Semaphore类的意义上)。如果许可证可用,则呼叫park将park返回,在此过程中消耗它;否则可能会阻止。 调用unpark使许可证可用,如果尚不可用。(与信号量不同,许可证不能累积,最多只有一个。) 方法park和unpark提供了阻止和解除阻塞线程的有效手段,该方法不会遇到导致不推荐使用的方法Thread.suspend和Thread.resume目的不能使用的问题: 一个...

java_kider的博客 462

2026.4.15:超详细自动安装Ubuntu-Server的保姆级教程

这篇教程详细介绍了如何创建无人值守的Ubuntu Server 26.04自动安装镜像。主要内容包括:从安装镜像中提取autoinstall-user-data文件并修改为user-data配置文件;使用mkpasswd生成加密密码;通过软碟通工具修改ISO镜像,添加自动安装所需的user-data和meta-data文件;编辑grub.cfg引导文件以启用自动安装模式。教程提供了完整的yaml配置示例,包含网络、存储、用户等设置,并演示了最终制作完成的自动安装镜像效果。

拥抱具身智能,昇腾Ascend C 745

JUC学习笔记(4)—多线程之间按顺序调用

多线程之间按顺序调用,实现A-&gt;B-&gt;C 三个线程启动,要求如下: AA打印5次,BB打印10次,CC打印15次   接着 AA打印5次,BB打印10次,CC打印15次    。来10轮     public class ThreadOrderAccess { public static void main(String[] args) { ShareResource s...

java_kider的博客 414

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

HashMap实现原理

HashMap 的get 方法: //调用get方法返回Entry public V get(Object key) {         if (key == null)             return getForNullKey();         Entry entry = getEntry(key);         return null == entry ?

java_kider的博客 407

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

AQS 源码解读

1.先看一下类图 2.开始跟代码 找一个入口 new ReentrantLock()默认是非公平锁,false是非公平 进入lock.lock(),在ReentrantLock中的实现 看到是sync的lock方法 Sync是ReentrantLock的子类 找抽象方法lock()在非公平锁中的实现 compareAndSetState(0,1) 如果状态是0 更新为 1 setExclusiveOwnerThread(Thread.currentThr...

java_kider的博客 373

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

JUC学习笔记(11)—CopyOnWriteArrayList,CopyOnWriteArraySet,ConcurrentHashMap

public class NotSafeDemo { public static void main(String[] args) { Map&lt;String,String&gt; map = new ConcurrentHashMap&lt;String,String&gt;(); for (int i = 1; i &lt;=30; i++) { new T...

java_kider的博客 357

Netty3.x用户指南翻译(1)

第一章:开始这一章教程,使用简单的例子让你快速了解Netty的架构。当你读完这一章,你可以在Netty基础之上,写一个客户端和服务端。1. 开始之前能运行这一章实例的最小要求有两个:①,JDK 1.5以上,②,Netty版本3.7(因为我是翻译的3.7版本的用户指南)。当你确定了,你对这一章的内容中的类可能还有更多的问题。如果想知道更多关于这些类的消息,请查询API.为了你的便利所有的类都会在在线...

java_kider的博客 354

集合-01-数组

有两方面的问题将数组与其他集合类型区分开来:效率和类型。对于 Java 来说,为保存和访问一系列对象 (实际是对象的句柄)数组,最有效的方法莫过于数组。数组实际代表一个简单的线性序列,它使得元素的 访问速度非常快,但我们却要为这种速度付出代价:创建一个数组对象时,它的大小是固定的,而且不可在 那个数组对象的“存在时间”内发生改变。可创建特定大小的一个数组,然后假如用光了存储空间,就再创

java_kider的博客 329

JUC学习笔记(2)—线程间通信

import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; class ShareData { private int number = 0; private Lock lock = ...

java_kider的博客 292

JUC学习笔记(9)—Semaphore

在信号量上我们定义两种操作:acquire(获取) 当一个线程调用acquire操作时,它要么通过成功获取信号量(信号量减1), 要么一直等下去,直到有线程释放信号量,或超时。release(释放)实际上会将信号量的值加1,然后唤醒等待的线程。信号量主要用于两个目的,一个是用于多个共享资源的互斥使用,另一个用于并发线程数的控制。   public class SemaphoreDemo { ...

java_kider的博客 287

JUC学习笔记(7)—CountDownLatch

 让一些线程阻塞直到另一些线程完成一系列操作后才被唤醒。    CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,这些线程会阻塞。其它线程调用countDown方法会将计数器减1(调用countDown方法的线程不会阻塞), 当计数器的值变为0时,因await方法阻塞的线程会被唤醒,继续执行。 解释:5个同学陆续离开教室后值班同学才可以关门。也即    秦灭6国,一...

java_kider的博客 266

JUC学习笔记(8)—CyclicBarrier

CyclicBarrier的字面意思是可循环(Cyclic)使用的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活。线程进入屏障通过CyclicBarrier的await()方法。   public class CyclicBarrierDemo { private stat...

java_kider的博客 263

JUC学习笔记(3)—Lock锁

一个对象里面如果有多个synchronized方法,某一个时刻内,只要一个线程去调用其中的一个synchronized方法了,其它的线程都只能等待,换句话说,某一个时刻内,只能有唯一一个线程去访问这些synchronized方法锁的是当前对象this,被锁定后,其它的线程都不能进入到当前对象的其它的synchronized方法 加个普通方法后发现和同步锁无关换成两个对象后,不是同一把锁了,情况立刻...

java_kider的博客 252

JUC学习笔记(1)—ReentrantLock

import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; class Ticket//资源类 类 = 实例变量+实例方法 { private int number = 30; //Lock implementations provide more extensi...

java_kider的博客 243

JUC学习笔记(6)—创建线程的新方法Callable接口

public class CallableDemo { public static void main(String[] args) throws InterruptedException, ExecutionException { FutureTask&lt;Integer&gt; ft = new FutureTask&lt;Integer&gt;(new MyThread()); ...

java_kider的博客 194
上一篇: JUC学习笔记(4)—多线程之间按顺序调用
下一篇: JUC学习笔记(6)—创建线程的新方法Callable接口
木木那年
博客等级 码龄12年 37粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值