Hashtable的同步是个老问题了。这几天仔细看了一下Hashtable的实现代码,总算找到了一些答案,下面就聊聊这个。
首先说一下同步根(SyncRoot)。网上很多人都在讨论说是要锁table还是锁它。其实,对于非同步的Hashtable,也就是普通的通过new创建的hashtable,SyncRoot就是table它本身。因为这个属性的代码直接的返回了this,this是谁?当然就是当前的这个hashtable了。
其实呢,如果不需要加锁的hashtable,我们直接new出来一个hashtable然后直接用就可以了,也涉及不到所谓的SyncRoot属性。
那需要加锁(同步)的hashtable呢?(呵呵,不好意思,刚刚切入正题啊。),我在这里建议用SyncHashtable的。顾名思义嘛,SyncHashtable当然就是同步hashtable啦!我看了SyncHashtable的源代码,发现除了get方法,也就是read操作没有加锁之外,其他的方法都是简单的对Hashtable的override(忘记说了,SyncHashtable是继承Hashtable的)。也就是说,除read外的操作都是线程安全的,比如写。 那么read操作呢?我刚开始也是心怀疑虑的,因为先前看过了ArrayList和SyncArryList的源代码,发现SyncArrayList对所有的方法都加锁了。但是看过hashtable的源代码后,我的疑虑消除了。原来hashtable支持并发的read操作,如果加了锁,那一次就只能响应一个read操作了,那样的话效率就低很多了。不加锁,依然线程安全的。
下面再回来继续说一下SyncRoot。SyncHashtable也有一个SyncRoot,不过这个不是直接返回this了。其实,SyncHashtable虽然继承自hashtable,但是它内部还有一个hashtable,然后它override了hashtable的每个方法,在里面通过加锁(lock的方式)的方式,对它内部的hashtable进行操作。而那个SyncRoot,返回的就是这个内部的hashtable,而不是SyncHashtable本身。这么看起来,SyncHashtable是把它的父类当接口用了一回,呵呵。
不过呢,基本上,微软封装的这个SyncHashtable能够满足我们基本的同步hashtable的需求了。
如果你不满足微软提供的那个SynaHashtable,那你就得自己去写一个同步的的hashtable了。不幸的是,微软并没有公开SyncHashtable,虽然我们可以通过Hashtalbe的静态方法Synchronized来得到一个SyncHashtable,但是SyncHashtable本身是一个private class,我们不能继承它,只能完完全全的从头写一个我们自己的同步hashtable了。这个时候,你是要锁hashtable还是它的SyncRoot都没有关系拉,因为它们就是一个东西,呵呵。
相关知识
数组arr=[1,2,3,4]调用slice(2,3)方法后,返回值是[1,2]
蔬菜水肥同步调控高效栽培技术
WAS7部署连接IBM MQ的应用出现RC=2009的错误
一种卷盘喷灌水肥同步控制系统及方法
斗南鲜切花实现“线上线下”同步拍卖
淘客系统怎么同步订单
(同步精品课堂)2018
云南:斗南鲜切花实现“线上线下”同步拍卖
【语文同步生字导练课...
新田:积极推广机械化同步深施肥技术
网址: Hashtable的同步问题 https://m.huajiangbk.com/newsview827769.html
上一篇: 什么花草茶有减肥的作用呢? |
下一篇: 《诗歌鉴赏表达技巧之动静结合》教 |