### 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異常;