忽然想不通了,Java里的读写锁里的读锁有什么用?

ReentrantReadWriteLock里的readLock有什么用?
看百度上有个人说这样能让多线程不阻塞进入临界区,
可是不加锁的话多线程不是都可以访问临界区吗?
如果阻塞的话怎么会出现线程安全问题……
求大佬指点迷津,加读锁和不加读锁有啥区别。
全部评论
读-写锁 (1)读写锁的出现原因:   ReentrantLock实现一种标准的互斥锁,每次最多只有一个线程能持有ReentrantLock,限制了并发性,互斥是一种保守的加锁策略,虽然避免了“写/写”冲突和“写/读”冲突,但也避免了“读/读”冲突,而大部分情况下读操作比较多,如果此时能够放宽加锁需求,允许多个读操作的线程同时访问数据结构,可以提升程序的性能(只要每个线程保证读取到最新的数据,并且在读取数据时不会有其他线程修改数据就行) (2)ReentrantLock提供的非互斥的读写锁的定义 1)一个资源可以被多个读操作访问,或者被一个写操作访问,但两者不能读写操作同时进行。2)读-写锁是一种性能优化措施,可以实现更高的并发性,提高程序的性能。3)当锁的持有时间较长并且大部分操作都不会修改被守护的资源时,读-写锁可以提高并发性。
2 回复 分享
发布于 2017-09-03 08:02
总的来说 读写互斥和读锁共享,再来说场景 单/多线程 1、单线程:锁可重入(多个读或多个写) 2、多线程:当前线程读阻塞其他线程写,当前线程写阻塞其他线程读写
1 回复 分享
发布于 2021-11-28 17:38
读读不互斥,读写互斥,写写互斥
4 回复 分享
发布于 2017-09-02 22:40
防止读的时候其他线程写,允许读的时候其他线程读
3 回复 分享
发布于 2017-09-02 22:35
加读锁应该是防止在写入的时候读取,防止读取脏数据
2 回复 分享
发布于 2020-03-10 17:18
刚学到这里,回复下自己的看法。因为读写锁锁住的不是共享资源,而是临界区,临界区里是对共享资源的操作,读写锁能控制多线程里的临界区对于共享资源访问的动作,但是不能控制共享资源不被别人访问。没有在锁住的临界区内的其它的线程依旧可以访问共享资源。所以如果不加读锁就会导致写的时候,共享资源被读。有此类问题的朋友可以试着写一下代码跑一下看看。
点赞 回复 分享
发布于 2022-02-16 22:54
加读锁,保证可重复读。  加写锁,自己写,也阻塞别人读,因为数据正在改动。
点赞 回复 分享
发布于 2020-12-04 23:00
关键理解是同一锁对象 :用同一个锁对象, 在加了写锁的代码块执行期间,能阻塞 对该锁对象加写锁,当然也阻塞了写锁加锁和解锁之间的代码块的执行。
点赞 回复 分享
发布于 2018-11-23 18:28
请求读锁的线程进去之后,其他请求读锁线程可以继续进入。但此时,请求写锁的线程不能进入,会被阻塞,直到所有请求读锁的线程结束之后,才有可能进入。
点赞 回复 分享
发布于 2017-09-03 07:43
读锁:共享锁 写锁:排它锁
点赞 回复 分享
发布于 2017-09-03 02:00
等你用到的时候就理解了
点赞 回复 分享
发布于 2017-09-03 01:26
h_b吧
点赞 回复 分享
发布于 2017-09-03 00:04
处理高并发
点赞 回复 分享
发布于 2017-09-02 23:57
加了读锁别的线程如果要加写锁就阻塞了呀
点赞 回复 分享
发布于 2017-09-02 22:42

相关推荐

04-02 17:22
新疆大学 Java
1. 你在这个物流平台项目中扮演的角色是什么?主要负责后端的哪一部分?2. 能简单介绍一下你负责的核心模块(货单大厅)的业务流程吗?3. 货单大厅里高频使用的多条件组合查询,你后端的存储用的是什么?4. 这个查询对应的数据量有多大?5. 除了 MySQL,你有考虑过用别的存储引擎做这种多条件检索吗?有没有必要?如果要换,应该用什么来做?6. 简历上写了 SQL 优化,整个问题是怎么发现,然后怎么解决的?7. 什么是回表?8. 你用 EXPLAIN 发现查询慢,具体是因为没有用索引,还是索引没用对?9. 联合索引的“最左匹配原则”知道吗?具体是什么意思?10. “迷你豆包”这个项目是干什么用的?主要是出于什么考虑要做这个项目?11. 能简单介绍一下这个项目中你觉得比较感兴趣的技术点吗?12. 进程和线程的区别是什么?13. 进程的上下文切换和线程的上下文切换是怎么做的?包含了哪些步骤?14. 什么是虚拟内存?使用虚拟内存有什么好处?15. 缺页中断(Page Fault)是什么意思?16. 操作系统里面有哪些锁?(或 Java 里面有哪些锁?)17. 如果 synchronized 和 ReentrantLock(可重入锁)两个选的话,优先选哪个?为什么?18. 正常情况下(单体服务中),默认应该优先选哪个锁?19. 知道 BIO、NIO、AIO 吗?BIO 的“同步阻塞”是什么意思?20. 简单介绍一下 TCP 的三次握手和四次挥手过程。21. 为什么 TCP 建立连接需要三次握手?22. TIME_WAIT 状态出现在四次挥手的什么时候?23. TIME_WAIT 状态会持续多长时间?24. HTTP 状态码 404(找不到页面)代表什么?这是服务端的问题还是客户端的问题?25. HTTP 状态码 504 一般出现在什么情况下?26. 在浏览器里面输入一个网址,到页面最终展示出来,这中间经历了怎样的过程?27. 什么是 TCP 的粘包和拆包?28. 怎么解决粘包和拆包的问题?29. MySQL InnoDB 引擎的索引使用的是什么树结构?B+树和B树的区别是什么?30. 为什么 MySQL 采用 B+树,而不用红黑树?31. 听说过幻读吗?解释一下什么是幻读。32. 怎么解决幻读问题?33. 幻读在什么隔离级别下可以解决?34. 一般怎么解决 Redis 缓存与 MySQL 数据库的缓存一致性问题?35. JVM 的内存模型(运行时数据区)包括哪些部分?36. 字符串(String)和数字在 JVM 中分别存放在哪里?37. 垃圾回收(GC)算法有哪些?38. CMS 和 G1 垃圾回收器的区别是什么?它们分别应对什么场景?39. 为什么到了 JDK 1.8 之后开始主流推荐使用 G1?CMS 有什么缺点?40. 相比之下,CMS 和 G1 谁的 GC 停顿时间会更长?为什么?41. HashMap 和 ConcurrentHashMap 的区别是什么?42. ConcurrentHashMap 是怎么做到线程安全的?43. 简单介绍一下 Spring 的控制反转(IOC)和面向切面编程(AOP)。44. AOP 的核心底层是使用什么机制实现的?45. 我们平时写个注解就能生效,注解的基本原理是什么?它为什么能把逻辑织入到代码运行路径中?46. 你平时是怎么使用 AI 辅助开发的?你的项目代码是直接用 AI 写的吗?47. RAG(检索增强生成)的一个完整运行流程是怎样的?48. 为什么要做 RAG 这个东西?它解决了什么问题?49. Token 和上下文窗口(Context Window)的概念分别是什么意思?50. 为什么要控制 Token 的数量?51. 大模型的“幻觉”是什么意思?是怎么产生的?
面试问题记录
点赞 评论 收藏
分享
评论
点赞
15
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务