### 1 Java多线程技能
Thread有8个构造函数;带ThreadGroup的四种,带Runnable的两种,一种空,一种带字符串;
一个runnable多个线程容易构造出非线程安全情况;
println()方法内部是同步的;
currentThread()方法返回代码段正在被哪个线程调用的信息;
Java退出线程的3种方法:退出标记、stop、interrupt;
线程sleep的时候interrupt()会抛出异常,并清除停止标记;
Thread.stop()会抛出public class ThreadDeath extends Error,可以进行捕获;
interrupt()方法只是在当前线程中设置一个中断标记;
用yield方法可以让当前线程把运行的优先级让给别的线程,构造示例:一个线程进行5万个数字累加,加上yield方法,会导致整个运行时间变长;
setPriority()方法可以设置线程的优先级,构造示例:5万个数字累加,高优先级的线程执行的时间段;
守护线程setDaemon(true),用户线程没有了,守护线程也就结束了,GC就是守护线程,构造示例:守护线程不停的打印,主线程退出,守护线程也不执行了;
### 2 对象及变量的并发访问
方法内部的私有变量不存在非线程安全问题;
synchronized方法是对当前对象进行加锁,synchronized代码块是对某一个对象加锁;
JVM中String的常量池功能,可能导致锁是一个锁;
如果锁是String,锁对象在线程中改变了,可能导致其他线程异步执行;
如果锁是对象,对象属性改变了,锁不会改变;
volatile强制从公共堆栈中获取变量的值,而不是从线程私有数据栈中获取变量的值;
### 3 线程间通信
sleep不会释放锁;
notify()不会释放锁,要等synchronized块执行完毕之后才释放锁;
wait()会立即释放锁;
wait的时候interrupt会报InterruptedException异常;