忽然想不通了,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

相关推荐

年前面的一共两轮面试,二面挂了,十分的可惜呀,虽然我作为一个纯JAVA选手,还是临时准备了一些安卓开发的一些内容,但是二面还是应付不过,整理一下面试题吧1. 做一个自我介绍2. HTTP、Socket 有什么差别3. WebSocket 是什么,和 HTTP、Socket 区别4. TCP 如何保障传输可靠5. TCP 拥塞控制有哪些方法6. HTTPS 原理,和 HTTP 区别7. 为什么用 NIO,相比 BIO 解决了什么问题8. 继承、封装、多态9. 重写和重载的区别10. Java 四种引用是什么,有什么区别、使用场景11. GC 可达性分析算法12. GC Roots 有哪些13. Java 异常种类,Exception 和 Error 区别14. 什么是泛型,泛型擦除是什么15. 泛型通配符类型有哪些16. ArrayList 底层结构和扩容模式17. ArrayList 和 LinkedList 区别18. HashMap 底层结构19. JDK 1.8 之后 HashMap 有什么变化20. HashMap 线程安全吗,为什么21. ConcurrentHashMap 1.7 和 1.8 区别22. 线程池工作原理23. 线程池队列满、最大线程也满,再添加任务会怎样24. 线程池拒绝策略有哪些25. JDK 预置线程池有哪些,有什么问题26. IO 密集型和计算密集型线程池怎么配置27. Java 中保证线程安全的机制还有哪些28. 协程了解吗,Go 和 Kotlin 协程对比29. 什么是 Spring IOC,作用是什么30. 安卓里自己实现 IOC 容器思路31. 什么是依赖注入 DI32. 自己设计依赖注入框架怎么做33. 什么是 AOP 思想,应用场景34. 什么是高级函数35. 延时任务实现方式有哪些36. Activity 生命周期37. Activity 弹弹窗生命周期有什么变化38. Android 四大组件及其作用39. 开发中常用哪些设计模式,怎么用40. MVC、MVP、MVVM 介绍41. 职业规划方向,和客户端开发会不会冲突42. 低代码/AI 辅助开发你是怎么做的43. 怎么提升 AI 生成代码效果44. 有没有做前后端规范约束生成效果45. 手写:链表反转(不使用额外内存)个人感想:面试官人很好,感觉挺和蔼的,题的话也是基础偏多一点,基本上都能回答出来,然后也是很快就约了二面了
吃不饱的迪恩很紧张:这么多
点赞 评论 收藏
分享
1~5.个人信息,实习等。6. 简单说说MySQL的索引?7. 为什么需要引入索引?8. 有10个查询SQL,是否可以创建10个索引?9. 了解最左匹配原则吗?联合索引ABC,查询where A and B会命中索引吗?10. 联合索引ABC,查询where B and C会命中索引吗?11. 做过索引相关的优化吗?如何判断写的SQL好坏?12. 用过explain吗?其作用是什么?核心关注哪些字段?13. 遇到过回表吗?回表是什么?如何避免回表?14. 做过分页吗?OFFSET+LIMIT跨1万页和跨1页有区别吗?15. 若分页按姓名排序(非ID),如何解决深度分页问题?16. Java线程池有几种创建方式?17. 手动创建线程池的核心参数有哪些?18. 调用并发量为1的API(如短信API),线程池核心参数该如何设置?19. 核心线程数设为1时,阻塞队列数该如何设置?20. 若线程数很大,如何保证API同一时刻仅被调用一次(抛开线程池)?21. 本地加锁的代码在多实例部署时,还能控制API调用并发吗?22. 操作Redis缓存和数据库时,先删缓存还是先提交事务?有哪些解决方案?23. 核心业务服务与统计服务通过MQ交互,统计库无数据该如何排查?MQ挂了时,应用层该如何兜底保证消息不丢失?24. 候选人主动提问:后续面试流程是什么?面试官对自己的回答有何建议?0224下午一面,0224晚上7点二面。
查看36道真题和解析
点赞 评论 收藏
分享
评论
点赞
15
分享

创作者周榜

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