java.util.concurrent包(4)——读写锁ReentrantReadWriteLock

简介:
读读之间不互斥,但读写之间,写写之间互斥。提高了效率保证了安全。

import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class MyQueue
{
// 共享数据。该数据只能被一个线程写,可以被多个线程同时读
private Object data;
// 读读之间不互斥,但读写之间,写写之间互斥
ReadWriteLock rwlock = new ReentrantReadWriteLock();

// 取数据
public void get()
{
rwlock.readLock().lock();
try
{
String threadName = Thread.currentThread().getName();
System.out.println(threadName + ":准备读取数据了");
System.out.println(threadName + ":读取的数据是" + data);
}
catch (Exception ex)
{
ex.printStackTrace();
}
finally
{
rwlock.readLock().unlock();
}
}

// 写数据
public void put(Object data)
{
rwlock.writeLock().lock();
try
{
String threadName = Thread.currentThread().getName();
System.out.println(threadName + ":准备写数据了");
this.data = data;
System.out.println(threadName + ":写的数据是" + data);
}
catch (Exception ex)
{
ex.printStackTrace();
}
finally
{
rwlock.writeLock().unlock();
}
}
}

import java.util.Random;
public class MyQueueTest
{
public static void main(String[] args)
{
final MyQueue myqueue = new MyQueue();
for (int i = 0; i < 100; i++)
{
new Thread(new Runnable() {
public void run()
{
myqueue.get();
}
}).start();

new Thread(new Runnable() {
public void run()
{
myqueue.put(new Random().nextInt(1000));
}
}).start();
}
}
}

相关文章
JUC并发—1.Java集合包底层源码剖析
本文主要对JDK中的集合包源码进行了剖析。
深入理解Java锁升级:无锁 → 偏向锁 → 轻量级锁 → 重量级锁(图解+史上最全)
锁状态bits1bit是否是偏向锁2bit锁标志位无锁状态对象的hashCode001偏向锁线程ID101轻量级锁指向栈中锁记录的指针000重量级锁指向互斥量的指针010尼恩提示,讲完 如减少锁粒度、锁粗化、关闭偏向锁(-XX:-UseBiasedLocking)等优化手段 , 可以得到 120分了。如减少锁粒度、锁粗化、关闭偏向锁(-XX:-UseBiasedLocking)等‌。JVM锁的膨胀、锁的内存结构变化相关的面试题,是非常常见的面试题。也是核心面试题。
深入理解Java锁升级:无锁 → 偏向锁 → 轻量级锁 → 重量级锁(图解+史上最全)
[Java计算机毕设]基于ssm的OA办公管理系统的设计与实现,附源码+数据库+论文+开题,包安装调试
OA办公管理系统是一款基于Java和SSM框架开发的B/S架构应用,适用于Windows系统。项目包含管理员、项目管理人员和普通用户三种角色,分别负责系统管理、请假审批、图书借阅等日常办公事务。系统使用Vue、HTML、JavaScript、CSS和LayUI构建前端,后端采用SSM框架,数据库为MySQL,共24张表。提供完整演示视频和详细文档截图,支持远程安装调试,确保顺利运行。
185 17
深潜数据海洋:Java文件读写全面解析与实战指南
通过本文的详细解析与实战示例,您可以系统地掌握Java中各种文件读写操作,从基本的读写到高效的NIO操作,再到文件复制、移动和删除。希望这些内容能够帮助您在实际项目中处理文件数据,提高开发效率和代码质量。
118 4
java中的公平锁、非公平锁、可重入锁、递归锁、自旋锁、独占锁和共享锁
本文介绍了几种常见的锁机制,包括公平锁与非公平锁、可重入锁与不可重入锁、自旋锁以及读写锁和互斥锁。公平锁按申请顺序分配锁,而非公平锁允许插队。可重入锁允许线程多次获取同一锁,避免死锁。自旋锁通过循环尝试获取锁,减少上下文切换开销。读写锁区分读锁和写锁,提高并发性能。文章还提供了相关代码示例,帮助理解这些锁的实现和使用场景。
228 4
java中的公平锁、非公平锁、可重入锁、递归锁、自旋锁、独占锁和共享锁
|
8月前
|
Java 中的锁是什么意思,有哪些分类?
在Java多线程编程中,锁用于控制多个线程对共享资源的访问,确保数据一致性和正确性。本文探讨锁的概念、作用及分类,包括乐观锁与悲观锁、自旋锁与适应性自旋锁、公平锁与非公平锁、可重入锁和读写锁,同时提供使用锁时的注意事项,帮助开发者提高程序性能和稳定性。
299 3
|
8月前
|
Eclipse 创建 Java 包
Eclipse 创建 Java 包
121 1
|
9月前
|
Java 中锁的主要类型
【10月更文挑战第10天】
Java/Spring项目的包开头为什么是com?
本文介绍了 Maven 项目的初始结构,并详细解释了 Java 包命名惯例中的域名反转规则。通过域名反转(如 `com.example`),可以确保包名的唯一性,避免命名冲突,提高代码的可读性和逻辑分层。文章还讨论了域名反转的好处,包括避免命名冲突、全球唯一性、提高代码可读性和逻辑分层。最后,作者提出了一个关于包名的问题,引发读者思考。
604 0
Java/Spring项目的包开头为什么是com?
java的synchronized有几种加锁方式
Java的 `synchronized`通过上述三种加锁方式,为开发者提供了从粗粒度到细粒度的并发控制能力,满足了不同场景下的线程安全需求。合理选择加锁方式对于提升程序的并发性能和正确性至关重要,开发者应根据实际应用场景的特性和性能要求来决定使用哪种加锁策略。
119 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问