java基础知识备忘

Posted by K on October 10, 2019

锁循环等待

wait()可能会发生虚假唤醒,推荐唤醒后增加额外循环判断,判断条件需在锁块中

public void Correct() throws InterruptedException {
	// Correct checking of the wait condition. The condition is checked
	// before waiting inside the locked region, and is rechecked after wait
	// returns.
	synchronized(lock) {
		while(!someCondition) {
			lock.wait();
		}
	}
}

gc root

简单点理解:

  • 虚拟机当前栈帧(正在执行的函数)本地变量表中引用的对象;
  • 方法区中类静态属性引用的对象;
  • 方法区中常量引用的对象;
  • 本地方法栈中JNI(即一般说的Native方法)引用的对象;

Looper为啥要用static的sThreadLocal

其实可以设计成有个单例的LooperManager,有一个成员变量mThreadLocal,这个LooperManager给每个线程产生Looper实例 这样做和static sThreadLocal达到的效果基本一致

CAS

挂起和恢复线程都要转入内核态,开销较大 CAS操作一般会用自旋 无锁-偏向锁-轻量级锁-重量级锁