您好!欢迎来到爱源码

爱源码

热门搜索: 抖音快手短视频下载   

Java读写锁就是这么简单。 [源码交易]

  • 时间:2022-07-08 02:11 编辑: 来源: 阅读:332
  • 扫一扫,手机访问
摘要:Java读写锁就是这么简单。 [源码交易]
序言在实际项目中,例如,如果我们有一个共享资源文件,我们的程序将同时读写该共享资源文件。如何在高并发场景下保证安全高效的读写?好了,看下面就知道提醒了:以下是本文主要内容,案例仅供参考。1.技术细节。什么是1。ReentranReadWriteLock?ReadLock提供了readlock和writeLock两种操作机制,一种是读锁,一种是写锁,其实现类为ReentranReadWriteLock。在没有写锁的情况下,读锁可以被多个线程同时持有,而写锁是独占的(exclusive)。 这意味着一次只有一个线程可以写入,但是多个线程可以并发读取。 理论上,读写锁比互斥锁允许更大程度的共享数据并发。 与互斥体相比,读写锁能否提高性能取决于读写数据的频率、读写操作的持续时间以及读写线程之间的竞争。 二、源代码分析1。Readlock直接看ReadLock源代码image.gif,可以看到ReadLock的锁操作实际上实现了Sync对应的tryAcquireShared方法。让我们点击查看imageimage.gif如果另一个线程持有写锁,它将失败。 ReaderShouldBlock():读锁是否需要等待(公平锁准则);r & ltMAX_COUNT:持有的线程数小于最大数量;CompandsetState (C,C+shared _ unit):设置读锁状态;整体是指读取线程是否应该被阻塞且小于最大值,比较设置成功。否则判断读锁的数量不为0并且不是当前线程,获得计数器和+1。执行方法的最后一行是因为线程明显不满足条件,或者CAS失败或者计数饱和,使用完整版的采集。这里的方法可以解决CAS miss和tryAcquireShared中未解决的重入读取。2.WriteLock,然后看WriteLock的源代码,image image.gif image image.gif独占计数方法。方法的作用是用0xFFFF &运算做同步变量,计算结果是写锁的个数,所以W的值就是写锁的个数。如果C不为0,则表示锁被占用。它是写锁还是读锁?这时候就要根据w的值来判断了。 如果c等于0,说明此时锁还没有被任何线程占用,那么就让线程直接尝试获取锁。如果w为0,说明写锁的个数为0,而此时由于c不等于0,说明锁被占用了,但不是写锁。那么锁定状态必须是读取锁定。由于是读锁状态,此时要获取锁,写锁会失败,所以当w等于0时,tryAcquire方法返回false。 如果w不为0,则在此时处于锁状态时写入锁,然后进行current!= getExclusiveOwnerThread()判断持有锁的线程是否可以是当前线程;如果不是当前线程,tryAcquire()返回false;如果是当前线程,那么继续下面的逻辑。 为什么当前线程在持有锁的情况下仍然可以执行下面的逻辑?这是因为读写锁是可重入的。 第三,单元测试还行,不废话。接下来是简单直接的单元测试包com . hyh . core . test;导入org . JUnit . test;导入Java . util . concurrent . executorservice;导入Java . util . concurrent . executors;导入Java . util . concurrent . time unit;导入Java . util . concurrent . locks . lock;导入Java . util . concurrent . locks . reentrantreadwritelock;/* * *再入读写锁测试* * @作者:何玉华* @ date:2021/1/28 14:14 */public class reentrantreadwritelock test { reentrantreadwritelock reentrantreadwritelock = newreentrantreadwritelock();lock read lock = reentrantreadwritellock . read lock();lock write lock = reentrantreadwritelock . writeLock();@Test public void test()抛出interrupted exception { ExecutorService thread pool = executors . newfixedthreadpool(10);for(int I = 0;我& lt5;i++){ thread pool . execute(()-& gt;{ read lock();});thread pool . execute(()-& gt;{ write lock();});} threadpool . shut down();时间单位。SECONDS.sleep(十);}私有void read lock(){ read lock . lock();请尝试{ system . out . println(thread . current thread()。getname()+"-获取读锁...");时间单位。seconds . sleep①;} catch(interrupted exception e){ e . printstacktrace();}最后{ system . out . println(thread . current thread()。getname()+"-释放读取锁定...");read lock . unlock();} } private void write lock(){ write lock . lock();请尝试{ system . out . println(thread . current thread()。getname()+"-获取写锁定...");时间单位。seconds . sleep①;} catch(interrupted exception e){ e . printstacktrace();}最后{ system . out . println(thread . current thread()。getname()+"-释放写锁定...");write lock . unlock();}}}这里复制代码image.gif,模拟5读5写的并发。马上看执行结果imageimage.gif imageimage.gif,可以看到多个线程可以同时获取读锁,而写锁只能在读锁释放后才能获取。只有在释放写锁之后,才能获得相同的读锁。一句话:读共享,写与写互斥,读与写互斥。 读写锁的适用场合:与ReentrantLock相比,ReadWriteLock适用于一般场合,使用得当可以进一步提高并发推荐读取。阿里巴巴程序员为什么成长这么快?看了他们的内部资料,我明白了从事一年开发的程序员能拿多少钱?字节跳动总结的设计模式PDF火了。下载完整版刷Github的时候发现了一个阿里大神的算法的笔记!年薪50W的明星70.5K程序员的知识体系和成长路线 关于【暴力递归算法】你不知道如何开发鸿蒙系统。谁来做系统?华为微内核访谈谈AOP。面试官只有一个字:发球!看完三件事,如果你觉得这个内容对你还是挺有帮助的,我想请你帮我做三件小事:喜欢,转发,有你的“喜欢和评论”是我创作的动力。 关注微信官方账号“Java斗皇”,不定期参考原创知识。 同时可以期待后续文章ing。


  • 全部评论(0)
资讯详情页最新发布上方横幅
最新发布的资讯信息
【域名/主机/服务器|】qq邮箱提醒在哪里打开(2024-06-04 18:58)
【技术支持|常见问题】1556原创ng8文章搜索页面不齐(2024-05-01 14:43)
【技术支持|常见问题】1502企业站群-多域名跳转-多模板切换(2024-04-09 12:19)
【技术支持|常见问题】1126完美滑屏版视频只能显示10个(2024-03-29 13:37)
【技术支持|常见问题】响应式自适应代码(2024-03-24 14:23)
【技术支持|常见问题】1126完美滑屏版百度未授权使用地图api怎么办(2024-03-15 07:21)
【技术支持|常见问题】如何集成阿里通信短信接口(2024-02-19 21:48)
【技术支持|常见问题】算命网微信支付宝产品名称年份在哪修改?风水姻缘合婚配对_公司起名占卜八字算命算财运查吉凶源码(2024-01-07 12:27)
【域名/主机/服务器|】帝国CMS安装(2023-08-20 11:31)
【技术支持|常见问题】通过HTTPs测试Mozilla DNS {免费源码}(2022-11-04 10:37)

联系我们
Q Q:375457086
Q Q:526665408
电话:0755-84666665
微信:15999668636
联系客服
企业客服1 企业客服2 联系客服
86-755-84666665
手机版
手机版
扫一扫进手机版
返回顶部