11 2020 档案
摘要:和 Mysql 主从复制的原因一样,Redis 虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况。为了分担读压力,Redis 支持主从复制,Redis 的主从结构可以采用一主多从或者级联结构,Redis 主从复制可以根据是否是全量分为全量同步和增量同步。下图为级联结构。 全量同步Redis
阅读全文
摘要:刚开始认识volatile的时候,觉得对它的一些特性非常迷惑。比如:具有可见性,如果一个线程修改了volatile变量的值,那么其它线程也会发现这一点;同时它又不具有原子性,多个线程对被volatile修饰的int 变量累加会造成相互覆盖。这我就迷糊了:不是一个线程修改了,其它的线程中数据都无效了么
阅读全文
摘要:引言 在日常开发中,线程池是使用非常频繁的一种技术,无论是服务端多线程接收用户请求,还是客户端多线程处理数据,都会用到线程池技术,那么全面的了解线程池的使用、背后的实现原理以及合理的优化线程池的大小等都是非常有必要的。这篇文章会通过对一系列的问题的解答来讲解线程池的基本功能以及背后的原理,希望能对
阅读全文
摘要:引言 JDK中除了上文提到的各种并发容器,还提供了丰富的阻塞队列。阻塞队列统一实现了BlockingQueue接口,BlockingQueue接口在java.util包Queue接口的基础上提供了put(e)以及take()两个阻塞方法。他的主要使用场景就是多线程下的生产者消费者模式,生产者线
阅读全文
摘要:引言 容器是Java基础类库中使用频率最高的一部分,Java集合包中提供了大量的容器类来帮组我们简化开发,我前面的文章中对Java集合包中的关键容器进行过一个系列的分析,但这些集合类都是非线程安全的,即在多线程的环境下,都需要其他额外的手段来保证数据的正确性,最简单的就是通过synchronized
阅读全文
摘要:在上一篇《你真的懂ReentrantReadWriteLock吗?》中我给大家留了一个引子,一个更高效同时可以避免写饥饿的读写锁 StampedLock。StampedLock实现了不仅多个读不互相阻塞,同时在读操作时不会阻塞写操作。 为什么StampedLock这么神奇?能够达到这种效果,它的核心
阅读全文
摘要:引言 在前几篇文章中了解了ReentrantLock、Semaphore与CountDownLatch后,J.U.C包中基于AQS实现的并发工具类还剩一个比较重要的:读写锁ReentrantReadWriteLock。读写锁在Java面试过程中是一个经常性考的题目,他涉及到的知识点比较多,导致很多人
阅读全文
摘要:引言 上一篇文章中详细分析了基于AQS的ReentrantLock原理,ReentrantLock通过AQS中的state变量0和1之间的转换代表了独占锁。那么可以思考一下,当state变量大于1时代表了什么?J.U.C中是否有基于AQS的这种实现呢?如果有,那他们都是怎么实现的呢?这些疑问通过详细
阅读全文
摘要:引言 在synchronized未优化之前,我们在编码中使用最多的同步工具类应该是ReentrantLock类,ReentrantLock拥有优化后synchronized关键字的性能,又提供了更多的灵活性。相比synchronized,他在功能上更加强大,具有等待可中断,公平锁以及绑定多个条件等s
阅读全文
摘要:引言 上一篇文章中我们说过,volatile通过lock指令保证了可见性、有序性以及“部分”原子性。但在大部分并发问题中,都需要保证操作的原子性,volatile并不具有该功能,这时就需要通过其他手段来达到线程安全的目的,在Java编程中,我们可以通过锁、synchronized关键字,以及CAS操
阅读全文
摘要:引言 谈到volatile关键字,大多数开发者都有一定了解,可以说是开发者非常熟悉,深入之后又非常陌生的一个关键字。相当于轻量的synchronized,也叫轻量级锁,与synchronized相比性能上开销较少,同时又具备了可见性、有序性以及部分原子性,是Java并发需中非常重要的一个关键字。这篇
阅读全文
摘要:引言 上一篇文章聊到了Java内存模型,在其中我们说JMM是建立在happens-before(先行发生)原则之上的。为什么这么说呢?因为在Java程序的执行过程中,编译器和处理器对我们所写的代码进行了一系列的优化来提高程序的执行效率。这其中就包括对指令的“重排序”。重排序导致了我们代码并不会按照代
阅读全文
摘要:引言 在计算机系统的发展过程中,由于CPU的运算速度和计算机存储速度之间巨大的差距。为了解决CPU的运算速度和计算机存储速度之间巨大的差距,设计人员在CPU和计算机存储之间加入了高速缓存来做为他们之间的桥梁,在运算时,先将数据拷贝到高速缓存中,计算完成后再将结果写入计算机存储,这样大大提高了计算效率
阅读全文
摘要:一、锁机制 常用的锁机制有两种: 1、悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。悲观锁的实现,往往依靠底层提供的锁机制;悲观锁会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。 2、乐观锁:假设不会发生并发冲突,每次不加锁而是假设没有冲突而去完成某项操作,只在提交操作时检查
阅读全文
摘要:以下主要为重写loadClass()和使用线程上下文类加载器这两种打破双亲委派模型方法的总结,并结合具体实例进行分析。 参考:破坏双亲委派模型 什么地方违反了双亲委派模型 以JDBC为例谈双亲委派模型的破坏 本文转载自:https://blog.csdn.net/cy973071263/articl
阅读全文
摘要:1、背景: 1)当Tomcat中部署的两个WEB应用,都有相同的包路径以及类名称,但是业务实现不同。安装JVM的双亲委派机制,可能存在互相覆盖的情况; 所以为了解决以上问题,tomcat提供WebAPP ClassLoader : 加载各自应用下的WEB-INF/class WEB-INF/lib
阅读全文
摘要:1.B+树内节点不存储数据,所有 data 存储在叶节点导致查询时间复杂度固定为 log n。而B-树查询时间复杂度不固定,与 key 在树中的位置有关,最好为O(1)。 如下所示B-树/B+树查询节点 key 为 50 的 data。 B-树: 从上图可以看出,key 为 50 的节点就在第一层,
阅读全文
摘要:B 树全程是 Balance Tree, 也可以称为 B - 树,但中间的 - 不是减号,只是一杠 B - 树的重点: 把原来 “瘦高” 的树结构变得“矮胖”。 B 树是一种多路平衡查找树,它的每一个节点最多包含 K 个孩子,K 被称为 B 树的阶。k 的大小取决于磁盘页的大小。 只要树的高度足够低
阅读全文
摘要:最近在看mybatis的源代码,发现了mybatis中实现的LruCache使用到了LinkedHashMap,所以就探究了一下LinkedHashMap是如何支持Lru缓存的 LinkedHashMap内部维护了一个所有的Entity的双向链表 同时构造方法可以设置Iterator的时候,是按照插
阅读全文

浙公网安备 33010602011771号