源码学习
明月清风_Dustin
只能用一次的是打工,可以重复使用的是事业。公众号和小程序:超火壁纸
展开
-
如何保证HashMap的线程安全?
这是一道面试题,当时没有准备,临时回答有点忘了。后面看了一下,使用Collections.synchronizedMap()包装一下就可以了,原理就是对所有的修改操作都加上synchronized,保证了线程的安全。...原创 2019-11-20 19:03:41 · 2019 阅读 · 0 评论 -
ConcurrentHashmap中size的实现原理
在手写hashmap的时候,考虑到并发问题,用的直接是synchronized进行加锁操作,使得线程安全,但这样在并发情况下性能会很低。ConcurrentHashmap主要使用的事synchronized加cas来实现并发控制,synchronized用于数组上,控制链表上的并发。cas用来控制size的并发修改,cas存在修改失败的可能性,这个时候引入了fullAddCount方...原创 2019-11-20 18:55:02 · 413 阅读 · 0 评论 -
java中使用CAS遇到的问题
1.在使用cas的时候,一般会使用循环,来保证操作成功,这样会使得CPU开销很大2.一次只能保证一个元素的原子操作3.有ABA问题需要注意原创 2019-11-06 12:51:33 · 216 阅读 · 1 评论 -
ReentrantLock源码分析
ReentrantLock与synchronized不同之处是加锁是用reentrantLock.lock(),解锁用的是reentrantLock.unlock(),实现原理是cas加上队列来实现。可以实现公平锁和非公平锁,实现公平锁其实用的就是队列,先进先出,非公平锁就没有用到队列,只用到cas保持多线程时候只有一个线程可以获得锁。用到state,每次重入的时候,用volatile修饰...原创 2019-11-03 23:14:34 · 71 阅读 · 0 评论 -
手写Hashmap第二版
在第一版的基础上,如果需要实现线程安全,需要在增加、删除、扩容的时候加锁。扩容的时候,需要对整个数组加锁。增加和删除的时候,只需要对链表的头结点进行加锁。具体实现代码如下:package www.dustin.li.collections;import java.util.concurrent.atomic.AtomicInteger;/** * 手写集合 * * ...原创 2019-10-25 18:46:27 · 176 阅读 · 0 评论 -
手写Hashmap第一版
关于hashmap的问题,经常被问到。虽然看了一下源码和相关博客,记忆还是不太深刻。发现只有手写之后,对其中的运行原理才有更深刻的理解。这里记录第一版,实现了存储、查询、删除、扩容操作,是线程不安全的,且没有实现迭代器功能。链表里面没有用到红黑树。一步步迭代,先记录自己的第一步。package www.dustin.li.collections;/** * 手写集合 * ...原创 2019-10-25 12:58:28 · 95 阅读 · 0 评论 -
netty高性能的原因
“性能是设计出来的,而不是测试出来的”。下面我们看Netty的架构设计是如何实现高性能的。(1)采用异步非阻塞的I/O类库,基于Reactor 模式实现,解决了传统同步阻塞I/O模式下一个服务端无法平滑地处理线性增长的客户端的问题。(2) TCP接收和发送缓冲区使用直接内存代替堆内存,避免了内存复制,提升了I/O读取和写入的性能。(3)支持通过内存池的方式循环利用ByteBuf,避免了...原创 2019-10-15 10:42:50 · 1363 阅读 · 0 评论 -
Netty源码阅读之ByteBuf
一、ByteBufHolder与平时不一样的地方几乎所有的方法都返回了自己,只有第一个方法返回的是ByteBuf。这样做的好处是,可以链式调用多个方法来进行处理。平时写代码,基本上都是一个方法返回一个类型的结果,没有像这样进行设计。...原创 2019-10-10 16:38:00 · 107 阅读 · 0 评论 -
为什么JDK1.8中放弃了分段锁
在网上找了很多参考文章,讲解的都只是一知半解,看完以后都想放弃了,但还是想把这个问题搞清楚,所以多参考了几篇博客,然后看了一下源代码,最终理解了一点。 其实一切的优化和升级都是围绕时间和空间来进行的,jdk1.8中放弃分段锁,改用cas、synchronize、volatile。分段锁,其实让锁的粒度变大了,本来每个链表上发生冲突的可能性很小,现在把几个链表聚合在一...原创 2019-09-09 16:04:51 · 1760 阅读 · 0 评论 -
模拟跨域请求
跨域是什么?浏览器端为了安全,使用同源策略,即不同域名下的请求不允许在浏览器上显示。在服务器之间是没有这种限制的。解决的方法是在响应的时候向响应头里面插入允许跨域的标记就可以了。服务器在判断是否需要进行跨域处理时,会判断origin字段是否为null,如果为null则不进行跨域处理,否则进行跨域处理。<!DOCTYPE html><html lang="en">...原创 2019-06-27 09:24:46 · 8509 阅读 · 0 评论 -
关于hash相关的总结
1.hashmap为什么线程不安全? 1.1 size没有用volatile修饰,如果多线程同时进行put和remove,size的值不准 1.2 如果多线程同时put一个key值相同,会导致其中一个线程的value值丢失 1.3 如果多线程正好发送在resize的时候,也会导致数据的丢失相关文章参考: https://www.cnblogs.com/First...原创 2018-12-16 01:38:54 · 138 阅读 · 0 评论