摘要: 经常被问到hashcode方法和equals方法还有== ,网上都有结论,但我们不能知其然却不知其所以然。所以我们从string的hashcode和equals入手,探究这3者,先贴源码。 public int hashCode() { int h = hash; if (h == 0 && val 阅读全文
posted @ 2018-11-30 04:49 sagan15 阅读(710) 评论(0) 推荐(0) 编辑
摘要: 对于2元状态(true或者false)可以用2进制(0/1)来存储,每一位上都对应种属性的true/false,最多可以存储31种属性的状态。 增加 删除 判断某种属性可以按上述代码的算法实现。 好处:大大节约了存储空间,和运算时间,一个2进制数就可以最多包含31种属性的状态 阅读全文
posted @ 2018-11-29 08:56 sagan15 阅读(107) 评论(0) 推荐(0) 编辑
摘要: //TODO 阅读全文
posted @ 2018-11-28 05:27 sagan15 阅读(506) 评论(1) 推荐(1) 编辑
摘要: public class TrinityLock { //为3表示允许两个线程同时获得锁 private final Sync sync = new Sync(3); private static final class Sync extends AbstractQueuedSynchronizer 阅读全文
posted @ 2018-11-28 05:26 sagan15 阅读(473) 评论(0) 推荐(0) 编辑
摘要: 1.乐观锁--乐观锁是一种思想,它只解决对共享资源更新时的一致性问题,不解决读取共享资源过程中,其他线程修改了共享资源导致读取的是旧的资源的问题 一般范式为: 这种实现存在如下问题1):ABA问题 假如是链表结构,1线程操作期间,其他线程修改了A.next,1线程比较后自然以为是预期值,判断true 阅读全文
posted @ 2018-11-28 02:36 sagan15 阅读(1378) 评论(0) 推荐(0) 编辑
摘要: 上述代码是AbstractQueuedSynchronizer中关于如何往Node中添加尾节点的代码,使用的CAS自旋volatile变量法,解决高并发下插入尾节点不同步问题。 1.假如尾节点为空,说明节点队列为空,初始化一个头结点指向尾节点的队列; 2.继续for循环,这次进入else中,先把插入 阅读全文
posted @ 2018-11-27 23:30 sagan15 阅读(1073) 评论(0) 推荐(1) 编辑
摘要: 1.synchronized 下面代码,启动了2个线程,对同一个实例syntest的age变量进行自增操作 多次执行,每一次的结果都不同,而且不符合预期结果。原因和cpu时间片轮转机制,线程工作内存,主内存有关吧,准确原因还不知道。 为了获得预期结果,我想着给add方法加上synchronized修 阅读全文
posted @ 2018-11-25 02:18 sagan15 阅读(116) 评论(0) 推荐(0) 编辑
摘要: 1.cpu时间片轮转机制 计算机运行时需要同时运行多个程序,但一个cpu只能同时运行一个程序,为了让用户感觉同时多个程序都在运行,需要模拟并行运算,就引入cpu时间片轮转机制。 操作系统一般是按照一定策略,定期给每个活动的进程执行其内部程序的机会,并且每次只执行一小段时间,然后操作系统利用中断强行退 阅读全文
posted @ 2018-11-24 21:07 sagan15 阅读(293) 评论(0) 推荐(0) 编辑
摘要: 1.解析 如上图,hashmap基本结构如上,迷你版hashmap基本要实现hash put get resize //TODO 阅读全文
posted @ 2018-11-19 22:45 sagan15 阅读(112) 评论(0) 推荐(0) 编辑
摘要: //TODO 阅读全文
posted @ 2018-11-19 22:36 sagan15 阅读(182) 评论(0) 推荐(0) 编辑