HashMap解析 发表于 2020-06-26 | 分类于 Java容器 字数统计: 5.1k | 阅读时长 ≈ 21 [TOC] 存储结构内部包含了一个 Entry 类型的数组 table,1.8之后改成Node。 12//transient Entry[] table; transient Node<K,V>[] table; Entry 存储着键值对。它包含了四个字段,从 n ... 阅读全文 »
换电脑了迁移hexo博客(Win->MAC) 发表于 2020-06-26 | 分类于 hexo相关 字数统计: 462 | 阅读时长 ≈ 1 1.找到自己Windows的hexo根目录 2.在 Mac安装git和node.js 123首先在自己电脑上装好node和git(首先确保brew安装好了)brew install gitbrew install node 3.安装hexo 用node.js来安装 1npm install hex ... 阅读全文 »
redis缓存穿透、击穿、雪崩等 发表于 2020-06-26 | 分类于 redis 字数统计: 1.2k | 阅读时长 ≈ 4 [TOC] 什么是缓存穿透正常情况下,查询的数据都存在,如果请求一个不存在的数据,也就是缓存和数据库都查不到这个数据,每次都会去数据库查询,这种查询不存在数据的现象我们称为缓存穿透 穿透带来的问题如果每次都拿一个不存在的id去查询数据库,可能会导致你的数据库压力增大 解决办法 缓存空值 之所以发生穿 ... 阅读全文 »
阻塞、同步、乐观悲观相关概念 发表于 2020-06-25 | 分类于 并发编程 字数统计: 642 | 阅读时长 ≈ 2 [TOC] 阻塞当某个任务在执行过程中发出一个请求操作,但是由于该请求操作需要的条件不满足,那么就会一直在那等待,直至条件满足; 非阻塞当某个任务在执行过程中发出一个请求操作,如果该请求操作需要的条件不满足,会立即返回一个标志信息告知条件不满足,不会一直处于等待状态。 同步当多个任务要发生时,这些任 ... 阅读全文 »
synchronized的相关性质 发表于 2020-06-24 | 分类于 并发编程 字数统计: 3.7k | 阅读时长 ≈ 13 [TOC] 对象布局 对象填充,是将一个对象大小不足 8 个字节的倍数时,使用 0 填充补齐,为了更高效效率的读取数据,64 java 虚拟机,一次读取是 64 bit(8 字节)。 // monitor也是class, 其实例会存储在堆中,MarkWord中保存的是它的指针 Mark Word:默 ... 阅读全文 »
布隆过滤器 发表于 2020-06-24 字数统计: 252 | 阅读时长 ≈ 1 [TOC] 原理布隆过滤器(Bloom Filter)的核心实现是一个超大的位数组和几个哈希函数。假设位数组的长度为m,哈希函数的个数为k。首先将位数组进行初始化,每个都设为0。对于添加进来的新元素,将新元素经过k个hash函数,产生k个hash值,将hash值对应的位都置为1。查询某元素是否存在集 ... 阅读全文 »
CAS 发表于 2020-06-24 | 分类于 并发编程 字数统计: 676 | 阅读时长 ≈ 2 [TOC] 阻塞同步和非阻塞同步阻塞同步需要线程阻塞和唤醒所带来的性能问题,它属于一种悲观的并发策略,无论共享数据是否真的会出现竞争,它都要进行加锁。 cmpxchg CAS是什么它是乐观并发策略: 1**先进行操作,如果没有其它线程争用共享数据,那操作就成功了,否则不断地重试,直到成功。这种乐观的 ... 阅读全文 »
volatile的性质 发表于 2020-06-24 | 分类于 并发编程 字数统计: 1.9k | 阅读时长 ≈ 6 [TOC] 说说你对volatile关键字的理解就我理解的而言,被volatile修饰的共享变量,就具有了以下两点特性: 1 . 保证了不同线程对该变量操作的可见性; 2 . 禁止指令重排序 volatile关键字如何保证可见性的?要知道volatile是如何保证可见性的需要先了解下有关CPU缓存的 ... 阅读全文 »
ThreadLocal的原理 发表于 2020-06-24 | 分类于 并发编程 字数统计: 5.2k | 阅读时长 ≈ 22 [TOC] 概念ThreadLocal 用于提供线程局部变量,在多线程环境可以保证各个线程里的变量独立于其它线程里的变量。 也就是说 ThreadLocal 可以为每个线程创建一个【单独的变量副本】,相当于线程的 private static 类型变量。 示例12345678910111213141 ... 阅读全文 »
设计模式的设计原则 发表于 2020-06-15 字数统计: 402 | 阅读时长 ≈ 1 设计模式的原则开闭原则:面向对象设计中最基础的设计原则,指一个软件实体(类、模块、方法等)应该对扩展开放,对修改关闭。它强调用抽象构建框架,用实现扩展细节,提高代码的可复用性和可维护性。例如在版本更新时尽量不修改源代码,但可以增加新功能。 单一职责原则:一个类、接口或方法只负责一个职责,可以提高代码 ... 阅读全文 »