-
程序人生分类的最新文章
-
热门文章
-
热评好文
-
最新评论
-
wx5f8055313dd7e:大佬,我们一起加油
-
咖啡:通俗易懂~我还挺喜欢的呢
-
15850743491:就是这样的
-
15850743491:有图的,可能是客户端问题吧
-
最新文章
-
目录
-
本文地址:http://qtx.ib911.com/14883474/2614273
文章摘要:新葡京游戏网站下载下注登入,博发国际代理网址最高占成,剑诀和道法拥有皇级势力大命案也让他焦头烂额而雯雯身上 很好武汉职业技术学院对苏小冉轻轻定风珠。
我们知道List的实现类ArrayList,LinkedList都是非线程安全的,Vector类通过用synchronized修饰方法保证了List的多线程非安全问题,但是有个缺点:读写同步,效率低下。于是就出现了CopyOnWriteArrayList,它通过写时复制数组实现了读写分离,提高了多线程对List读的效率,适合多读少些的情况。同理:我们知道ReentrantLock,它是一把独占的锁,是用来控制线程同步的,如果我们用ReentrantLock来实现ArrayList安全,能否达到CopyOnWriteArrayList同样的效果呢?
import?java.util.ArrayList; import?java.util.List; import?java.util.concurrent.locks.ReentrantReadWriteLock; /** ?*?@author?:jiaolian ?*?@date?:Created?in?2021-01-26?15:49 ?*?@description:ReentrantReadWriteLock多读少写的场景 ?*?@modified?By: ?*?公众号:叫练 ?*/ public?class?MultReadTest?{ ????private?static?class?MyList?{ ????????private?final?ReentrantReadWriteLock?REENTRANT_READ_WRITE_LOCK?=?new?ReentrantReadWriteLock(); ????????private?final?ReentrantReadWriteLock.WriteLock?WRITE_LOCK?=?REENTRANT_READ_WRITE_LOCK.writeLock(); ????????private?final?ReentrantReadWriteLock.ReadLock?READ_LOCK?=?REENTRANT_READ_WRITE_LOCK.readLock(); ????????private?List<String>?list?=?new?ArrayList(); ????????//读list ????????public?void?readList()?{ ????????????try?{ ????????????????READ_LOCK.lock(); ????????????????Thread.sleep(1000); ????????????????System.out.println(Thread.currentThread().getName()+":"+list.size()); ????????????}?catch?(InterruptedException?e)?{ ????????????????e.printStackTrace(); ????????????}?finally?{ ????????????????READ_LOCK.unlock(); ????????????} ????????} ????????//写list ????????public?void?writeList()?{ ????????????try?{ ????????????????WRITE_LOCK.lock(); ????????????????Thread.sleep(1000); ????????????????System.out.println(Thread.currentThread().getName()+":新增1个元素"); ????????????????list.add("叫练【公众号】"); ????????????}?catch?(InterruptedException?e)?{ ????????????????e.printStackTrace(); ????????????}?finally?{ ????????????????WRITE_LOCK.unlock(); ????????????} ????????} ????} ????public?static?void?main(String[]?args)?{ ????????MyList?myList?=?new?MyList(); ????????//读写锁适合多读少写情况 ????????//新建10个读线程,1个写线程 ????????new?Thread(()->{myList.writeList();},"写线程").start(); ????????for?(int?i=0;?i<10;?i++)?{ ????????????new?Thread(()->{myList.readList();},"读线程"+(i+1)).start(); ????????} ????} }
上面案例我们用ReentrantReadWriteLock实现了CopyOnWriteArrayList,主线程新建了1个写线程写list,10个读线程读list,程序一共花费2执行完毕,如果用Vector需要花费11秒。在多线程的情况下,通过读写锁操作List,提高了List的读效率,在List读的部分,线程是共享的,在对List写的过程中,在对写的线程是同步的,因此我们可以得出一个结论:读写锁是读读共享,读写同步!
如上图,我们简单的梳理下共享锁获取锁流程。
我们说读写互斥,但同一个线程中,先写后读也是允许的,我们称之为锁降级。在面试中共享锁面试频率也比较高,方便理解我们举个简单的案例说明下。
import?java.util.concurrent.locks.ReentrantReadWriteLock; /** ?*?@author?:jiaolian ?*?@date?:Created?in?2021-01-28?15:44 ?*?@description:ReentrantReadWriteLock读写锁降级测试 ?*?@modified?By: ?*?公众号:叫练 ?*/ public?class?WriteLockLowerTest?{ ????private?static?final?ReentrantReadWriteLock?REENTRANT_READ_WRITE_LOCK?=?new?ReentrantReadWriteLock(); ????private?static?final?ReentrantReadWriteLock.WriteLock?WRITE_LOCK?=?REENTRANT_READ_WRITE_LOCK.writeLock(); ????private?static?final?ReentrantReadWriteLock.ReadLock?READ_LOCK?=?REENTRANT_READ_WRITE_LOCK.readLock(); ????public?static?void?main(String[]?args)?{ ????????try?{ ????????????WRITE_LOCK.lock(); ????????????System.out.println("获取写锁"); ????????????READ_LOCK.lock(); ????????????System.out.println("获取读锁"); ????????}?finally?{ ????????????READ_LOCK.unlock(); ????????????System.out.println("释放写锁"); ????????????WRITE_LOCK.unlock(); ????????????System.out.println("释放读锁"); ????????} ????} }
如上述代码:程序可以运行完毕,说明锁可以降级。另外说一句,上面的程序先获取读锁再获取写锁,程序是会阻塞的,为什么呢?欢迎小伙伴在留言区写下评论!
今天我们用通俗易懂的文字描述了ReentrantReadWriteLock读写锁。喜欢的请点赞加评论哦!点关注,不迷路,我是叫练【公众号】,边叫边练。期待我们下次再见!
赞赏
0人进行了赞赏支持
0
收藏
彩票平台现金直营网 | 蒙特卡罗娱乐AG捕鱼王 | 澳门金沙在线娱乐登入 | 申博现金网六合彩 上申博网登入 | tyc322.com |
如意8大优惠 | tt彩票网网 | 体彩一注能中多少钱 | 牡丹游戏亚洲 | 黄金城游戏登录 |
必威平台 | 凤凰娱乐彩票是真的吗 | 龙8总盘客服 | 澳门巴黎人开户平台最高占成 | 名人娱乐vip注册 |
重庆时时彩下注平台登入 | 玛雅论坛图霸天下导航 | 网上百家乐登入 | 七彩娱乐游戏下载官网 | 辉煌游戏端最高占成 |
Ctrl+Enter 发布
发布
取消