下午匆忙电话面试了一下某司,有几个问题没有回答上来,总结一下:
1、zookeeper数据同步原理
读取的时候不需要数据同步,写操作时,follower的FollowerRequestProcessor会将该操作作为LEADER.REQEST发给leader。leader发起投票,由followers进行投票,leader对投票结果进行计算决定是否通过该决议,如果通过执行该决议(事务),否则什么也不做。
2、ThreadLocal原理
ThreadLocal作用是保存线程的局部变量,例如保存每个线程自身状态等,它之所以能够与线程绑定,是因为其为每一个使用该变量的线程都提供一个变量值的副本,这样每个线程都操作的是自己的副本,其源码如下:
public T get() {
Thread t = Thread.currentThread();
//从当前线程中获取该线程保存副本的Map
ThreadLocalMap map = getMap(t);
if (map != null) {
//根据当前线程,获取保存在副本中的value值
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null)
return (T)e.value;
}
//返回null
return setInitialValue();
}
private T setInitialValue() {
T value = initialValue();
//获取当前线程