这本书写的很浅,更多的是案例,ThreadLocal部分还可以,原理基本讲到了
大致总结了下面部分知识点
在什么情况下使用多线程?
start()方法耗时的原因是因为执行了多个步骤
使用常见的命令分析线程
jps -l 进程id
停止一个线程
优先级
守护线程,Java中有两种线程
同步关键字sychronized概述,使用javap命令反编译class文件为字节码
注意
volatile三个特性
线程间通信
ThreadLocal类
InheriatbleThreadLocal实现值继承的原理
具体的原理就是:
package java.lang; import java.lang.ref.*; /** * This class extends {@code ThreadLocal} to provide inheritance of values * from parent thread to child thread: when a child thread is created, the * child receives initial values for all inheritable thread-local variables * for which the parent has values. Normally the child's values will be * identical to the parent's; however, the child's value can be made an * arbitrary function of the parent's by overriding the {@code childValue} * method in this class. * * <p>Inheritable thread-local variables are used in preference to * ordinary thread-local variables when the per-thread-attribute being * maintained in the variable (e.g., User ID, Transaction ID) must be * automatically transmitted to any child threads that are created. * * <p>Note: During the creation of a new {@link * Thread#Thread(ThreadGroup,Runnable,String,long,boolean) thread}, it is * possible to <i>opt out</i> of receiving initial values for inheritable * thread-local variables. * * @author Josh Bloch and Doug Lea * @see ThreadLocal * @since 1.2 */ public class InheritableThreadLocal<T> extends ThreadLocal<T> { /** * Computes the child's initial value for this inheritable thread-local * variable as a function of the parent's value at the time the child * thread is created. This method is called from within the parent * thread before the child is started. * <p> * This method merely returns its input argument, and should be overridden * if a different behavior is desired. * * @param parentValue the parent thread's value * @return the child thread's initial value */ protected T childValue(T parentValue) { return parentValue; } /** * Get the map associated with a ThreadLocal. * * @param t the current thread */ ThreadLocalMap getMap(Thread t) { return t.inheritableThreadLocals; } /** * Create the map associated with a ThreadLocal. * * @param t the current thread * @param firstValue value for the initial entry of the table. */ void createMap(Thread t, T firstValue) { t.inheritableThreadLocals = new ThreadLocalMap(this, firstValue); } }
Lock对象的使用