摘要:
局部性原理 时间局部性:如果数据正在被访问,那么在近期它很可能还会被再次访问。比如循环、方法的反复调用等。 空间局部性:如果存储器的位置被引用,那么将来他附近的位置也会被引用。比如顺序结构、数组。 CPU缓存 执行程序是靠CPU执行主存中代码,但是CPU和主存的速度差异是非常大的,为了降低这种差距, 阅读全文
摘要:
Condition用途 当多个线程需要访问一个共享资源时,需要给共享资源加锁。 当一个线程释放锁时,所有等待锁的线程都会尝试去获取锁。如果想只让部分等待锁的线程去获取锁时,就需要用到Condition。 执行wait方法后,线程会阻塞,并释放同步代码块的锁(sleep方法会持有锁),notify的方 阅读全文
摘要:
Java 线程状态 (6 种) Java线程的生命周期分为:NEW(初始化状态)、RUNNABLE(可运行状态/运行状态)、BLOCKED(阻塞状态)、WAITING(等待状态)、TIMED_WAITING(有时限的等待)、TERMINATED(终止状态)。 可以看下源码中线程State的枚举类: 阅读全文
摘要:
AQS aqs全称为AbstractQueuedSynchronizer,它提供了一个FIFO队列,可以看成是一个用来实现同步锁以及其他涉及到同步功能的核心组件,常见的有:ReentrantLock、CountDownLatch等。AQS是一个抽象类,主要是通过继承的方式来使用,它本身没有实现任何的 阅读全文
摘要:
synchronized是Java内置的一个关键字,Lock是是一个Java接口。 synchronized无法判断获取锁的状态,而lock锁可以判断是否获取到了锁。 synchronized会自动释放锁,而lock必须手动释放锁。如果不释放就会变成死锁。 synchronized 可重入锁,不可以 阅读全文
摘要:
运行时,会在栈中产生两个引用,指向堆中相应的对象。 可以看到,ThreadLocalMap使用ThreadLocal的弱引用作为key,这样一来,当ThreadLocal ref和ThreadLocal之间的强引用断开 时候,即ThreadLocal ref被置为null,下一次GC时,thread 阅读全文
摘要:
读操作步骤(根据文档id查询): 客户端发送Get请求到NODE1。 NODE1使用文档的_id决定文档属于shard0。shard0的所有分片位于所有3个节点上。这次,它将请求路由至NODE2。 NODE2将文档返回给NODE1,NODE1将文档返回给客户端。 ES读数据底层原理: 客户端发送请求 阅读全文