重入锁 重入锁,顾名思义,就是支持重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁。重进入是指任意线程在获取到锁之后能够再次获取该锁而不会被锁阻塞,该特性的实现需要解决以下两个问题。 1、线程再次获取锁。锁需要去识别获取锁的线程是否为当前占据锁的线程,如果是,则再次成功获取。 2、锁的最终释放 ...
分类:
编程语言 时间:
2019-10-15 19:27:16
阅读次数:
89
1 HashMap在put的时候,插入的元素超过了容量(由负载因子决定)的范围就会触发扩容操作,就是rehash,这个会重新将原数组的内容重新hash到新的扩容数组中,在多线程的环境下,存在同时其他的元素也在进行put操作,如果hash值相同,可能出现同时在同一数组下用链表表示,造成闭环,导致在ge ...
分类:
其他好文 时间:
2019-10-11 00:29:09
阅读次数:
104
Java基础 1、HashMap的源码,实现原理,JDK8中对HashMap做了怎样的优化。 2、HaspMap扩容是怎样扩容的,为什么都是2的N次幂的大小。 3、HashMap,HashTable,ConcurrentHashMap的区别。 4、极高并发下HashTable和ConcurrentH ...
分类:
其他好文 时间:
2019-10-08 14:04:41
阅读次数:
97
java中的锁 Java锁的类别 java中的锁按照不同的类别可以有如下的分类: 乐观锁/悲观锁 独享锁/共享锁 互斥锁/读写锁 可重入锁 公平锁/非公平锁 分段锁 偏向锁/轻量级锁/重量级锁 自旋锁 乐观锁/悲观锁 独享锁/共享锁 互斥锁/读写锁 可重入锁 公平锁/非公平锁 分段锁 偏向锁/轻量级 ...
分类:
编程语言 时间:
2019-10-02 22:36:41
阅读次数:
105
一. 读写锁是怎么实现的? 继承AQS,然后通过将AQS中的state转化为二进制,分为高16位和低16位来区分。高16位表示读状态,低16位为写状态。 二. 解析表示方式(高低16位) 假设此时state是数值S a.写锁 在判断写锁时,通过 K=S&0X0000FFFF, 将高位全部抹掉,此时只 ...
分类:
其他好文 时间:
2019-09-30 21:41:49
阅读次数:
111
1.轻量级锁(Lock)与重量级锁(synchronized):都是可重入锁 2.可重入锁(递归锁):方法中嵌套方法,锁可传递 3.读写锁(ReentrantReadWriteLock)--读写分离 读锁(获取该值信息)和写锁(对该值操作) 4.乐观锁 本质没有锁,效率比较高、无阻塞、无等待、重试。 ...
分类:
其他好文 时间:
2019-09-15 14:14:55
阅读次数:
130
1. 临界区加排他锁(Go sync.Mutex.Lock()) 如果并发量大,锁竞争激烈,会导致性能开销大 2. 读多写少场景,使用读写锁(Go sync.Mutex.RLock()) 支持并发读,但写锁会block住读和写,读多场景性能会好很多 3. 对计数使用CAS操作(Go sync.ato ...
分类:
其他好文 时间:
2019-09-14 16:16:41
阅读次数:
108
在上一篇文章,我们已经实现了分布式锁。今天更进一步,在分布式锁的基础之上,使用ZooKeeper实现读写锁。 ...
分类:
其他好文 时间:
2019-08-23 13:47:38
阅读次数:
83
重点: 1、读锁共享 2、写锁互斥 3、读写锁互斥 锁降级:将写锁降级为读锁。(先获取写锁,再获取读锁,再释放写锁,最后释放读锁) 造成锁降级的原因:出于性能考虑,一般情况下,都将锁定的动作,精确到具体的语句块,在两个锁的语句块之间,有可能线程的交替执行,造成线程安全问题。 解决的方法: 1、将锁的 ...
分类:
其他好文 时间:
2019-08-17 00:43:26
阅读次数:
118
互斥锁 共享资源的使用是互斥的,即一个线程获得资源的使用权后就会将改资源加锁,使用完后会将其解锁,所以在使用过程中有其它线程想要获取该资源的锁,那么它就会被阻塞陷入睡眠状态,直到该资源被解锁才会别唤醒,如果被阻塞的资源不止一个,那么它们都会被唤醒,但是获得资源使用权的是第一个被唤醒的线程,其它线程又 ...
分类:
其他好文 时间:
2019-08-06 15:35:15
阅读次数:
94