0%

同步队列

∵ 多线程 ∴ 需要针对一些资源进行同步 ∴ 有了同步队列
实现方式主要有两种:阻塞方式(队列使用一个锁,出队入队用同一把锁或者队列使用两把锁,出队和入队用不同的锁)和非阻塞方式(底层通过循环CAS的方式)

synchronized是悲观锁,这种线程一旦得到锁,其他需要锁的线程就挂起的情况就是悲观锁
CAS操作的就是乐观锁,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。Compare And Swap 比较并替换

Read more »

多线程

多线程的目的不是提升执行速度等,而是提高资源利用效率,当有的线程不占用cpu时让出来资源,从而有可能达到提高效率的结果(线程太多有可能会变慢)。

JVM虚拟机的启动是多线程的,至少有两个线程:main 和垃圾回收机制。

Read more »

123-JavaScript-Interview-Questions

It’s a book about frontend interview question. We hope that it will help all javascript developers to prepare for a technical job interview.

Want to buy a book in paper form? Want some badass flashcards?

Read more »

ThreadLocal

参考网址

以数据库连接为例,如果多个线程共享一个连接,有可能一个线程在对数据库进行操作,另一个线程调用了closeConnection操作;如果在每一个线程都new一个连接对象,如果开启关闭数据库操作频繁,会影响到服务器压力,并且影响程序执行性能。
=> ThreadLocal 内部维护一个 ThreadLocalMap 类,保存的是 Entry<Thread K, Object V> 数组,K是线程,V是值,这样每一个线程无论在哪里调用,都会拿到自己线程的值

每个Thread对象中都持有一个ThreadLocalMap的成员变量。每个ThreadLocalMap内部又维护了N个Entry节点,也就是Entry数组,每个Entry代表一个完整的对象,key是ThreadLocal本身,value是ThreadLocal的泛型值

Read more »

血缘分析

1. LineageLogger

首先需要对 org.apache.hadoop.hive.ql.hooks.LineageLogger 这个类进行改写,原类会把 lineage 字段依赖信息打印到日志里去,但是现在我们需要把 lineage 信息直接 return 回来。

1
2
3
4
5
6
7
8
9
10
String lineage = out.toString();
if (testMode) {
log(lineage);
} else {
LOG.info(lineage);
}

=>
String lineage = out.toString();
return lineage;
Read more »