目录

hymn

忽有故人心头过,回首山河已是秋。

内核态 和 用户态 有更新!

【区别】 内核态:CPU可以访问内存所有数据,包括外围设备,例如硬盘,网卡。CPU也可以将自己从一个程序切换到另一个程序。 用户态:只能受限的访问内存,且不允许访问外围设备。占用CPU的能力被剥夺,CPU资源可以被其他程序获取。

ThreadLocal 有更新!

ThreadLocal 只是个工具类,真正的数据都是存在当前的线程内, get() public T get() { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) { ThreadLocalMap.Entry e = map.getEntry(this); if (e != null) { @SuppressWarnings("unchecked") T result = (T)e.value; return result; } } return setInitialValue(); } ThreadLocalMap getMap(Thread t) { return t.threadLocals; } 当线程调用 get() 时,是返回当前线程的 threadLocals,正真的数据就在这里。 set() public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap ma....

es查询term,match,match_phase,query_string的区别

1. match match:模糊匹配,需要指定字段名,但是输入会进行分词,比如"hello world"会进行拆分为hello和world,然后匹配,如果字段中包含hello或者world,或者都包含的结果都会被查询出来,也就是说match是一个部分匹配的模糊查询。查询条件相对来说比较宽松。 2. term term: 这种查询和match在有些时候是等价的,比如我们查询单个的词hello,那么会和match查询结果一样,但是如果查询"hello world",结果就相差很大,因为这个输入不会进行分词,就是说查询的时候,是查询字段分词结果中是否有"hello world"的字样,而不是查询字段中包含"hello world"的字样,elasticsearch会对字段内容进行分词,"hello world"会被分成hello和world,不存在"hello world",因此这里的查询结果会为空。这也是term查询和match的区别。 3. match_phase match_phase:会对输入做分词,但是需要结果中也包含所有的分词,而且顺序要求一样。以"hello world"为例....

interrupt() interrupted() isInterruped() 区别

void interrupt() 中断线程,例如A线程运行,B线程可以调用A的interrupt()方法来设置线程A的中断标志为true boolean interrupted() 检测当前线程是否被中断,当前线程指的是:在那个线程中调用,不是那个实例的调用。比如在主线程中调用线程 A 的 interrupted ,获取的还是主线程的中断状态。 另外在调用之后会清除当前线程的中断状态,如果当前的中断状态是 true ,调用完后变为 false 。 boolean isInterruped() 检查当前线程是否被中断,这个当前线程指的是:那个线程实例调用的,比如在主线程中调用A的 isInterruped() ,获取的是A线程的中断状态。不清楚当前线程的中断状态。

序列化代理

EnumSet :反序列化使用 反序列化代理 private static class SerializationProxy <E extends Enum<E>> implements java.io.Serializable { /** * The element type of this enum set. * * @serial */ private final Class<E> elementType; /** * The elements contained in this enum set. * * @serial */ private final Enum<?>[] elements; SerializationProxy(EnumSet<E> set) { elementType = set.elementType; elements = set.toArray(ZERO_LENGTH_ENUM_ARRAY); } // instead of cast to E, we should perhaps use ....

使用ThreadLocal

在一个线程中,横跨若干方法调用,需要传递的对象,我们通常称之为上下文(Context),它是一种状态,可以是用户身份、任务信息等。 给每个方法增加一个context参数非常麻烦,而且有些时候,如果调用链有无法修改源码的第三方库,User对象就传不进去了。 Java标准库提供了一个特殊的 ThreadLocal,它可以在一个线程中传递同一个对象。 ThreadLocal实例通常总是以静态字段初始化如下: static ThreadLocal<User> threadLocalUser = new ThreadLocal<>(); 它的典型使用方式如下: void processUser(user) { try { threadLocalUser.set(user); step1(); step2(); } finally { threadLocalUser.remove(); } } 通过设置一个 User实例关联到 ThreadLocal中,在移除之前,所有方法都可以随时获取到该 User实例: void step1() { User u = threadL....

ForkJoin

Java 7开始引入了一种新的Fork/Join线程池,它可以执行一种特殊的任务:把一个大任务拆成多个小任务并行执行。 我们举个例子:如果要计算一个超大数组的和,最简单的做法是用一个循环在一个线程内完成: ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ 还有一种方法,可以把数组拆成两部分,分别计算,最后加起来就是最终结果,这样可以用两个线程并行执行: ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ 如果拆成两部分还是很大,我们还可以继续拆,用4个线程并行执行: ┌─┬─┬─┬─┬─┬─┐ └─┴─┴─┴─┴─┴─┘ ┌─┬─┬─┬─┬─┬─┐ └─┴─┴─┴─┴─┴─┘ ┌─┬─┬─┬─┬─┬─┐ └─┴─┴─┴─┴─┴─┘ ┌─┬─┬─┬─┬─┬─┐ └─┴─┴─┴─┴─┴....

使用Future 和 CompletableFuture 有更新!

Future ExecutorService executor = Executors.newFixedThreadPool(4); // 定义任务: Callable<String> task = new Task(); // 提交任务并获得Future: Future<String> future = executor.submit(task); // 从Future获取异步执行返回的结果: String result = future.get(); // 可能阻塞 当我们提交一个 Callable任务后,我们会同时获得一个 Future对象,然后,我们在主线程某个时刻调用 Future对象的 get()方法,就可以获得异步执行的结果。在调用 get()时,如果异步任务已经完成,我们就直接获得结果。如果异步任务还没有完成,那么 get()会阻塞,直到任务完成后才返回结果。 一个 Future<V>接口表示一个未来可能会返回的结果,它定义的方法有: get():获取结果(可能会等待) get(long timeout, TimeUnit uni....

ScheduledThreadPool 细节

创建一个 ScheduledThreadPool仍然是通过 Executors类: ScheduledExecutorService ses = Executors.newScheduledThreadPool(4); 我们可以提交一次性任务,它会在指定延迟后只执行一次: // 1秒后执行一次性任务: ses.schedule(new Task("one-time"), 1, TimeUnit.SECONDS); 如果任务以固定的每3秒执行,我们可以这样写: // 2秒后开始执行定时任务,每3秒执行: ses.scheduleAtFixedRate(new Task("fixed-rate"), 2, 3, TimeUnit.SECONDS); 如果任务以固定的3秒为间隔执行,我们可以这样写: // 2秒后开始执行定时任务,以3秒为间隔执行: ses.scheduleWithFixedDelay(new Task("fixed-delay"), 2, 3, TimeUnit.SECONDS); 注意FixedRate和FixedDelay的区别。FixedRate是指任务总是以....

java.util.concurrent 有更新!

ReentrantLock java.util.concurrent.locks包提供的 ReentrantLock用于替代 synchronized加锁 public class Counter { private int count; public void add(int n) { synchronized(this) { count += n; } } } public class Counter { private final Lock lock = new ReentrantLock(); private int count; public void add(int n) { lock.lock(); try { count += n; } finally { lock.unlock(); } } } // 可以尝试去获取锁,尝试获取锁的时候,最多等待1秒。 // 如果1秒后仍未获取到锁,tryLock()返回false, // 程序就可以做一些额外处理,而不是无限等待下去 if (lock.tryLock(1, TimeUnit.SECONDS)) { try { .......