-
start()和run()方法 (start會新啟一個線程,run不會)
run()方法就是普通對象的普通方法start()方法 java才會將線程對象和操作系統(tǒng)中的實際線程進行映射,再來執(zhí)行run()方法
yield()讓出cpu的執(zhí)行權(quán),將線程從運行狀態(tài)轉(zhuǎn)到可運行狀態(tài),但是下個時間片,該線程依然有可能被再次選中運行守護線程和主線程共死,finally不能保證一定執(zhí)行
synchronized內(nèi)置鎖
- 對象鎖,鎖的是類的對象實例
- 類鎖,鎖的是每個類的Class對象,每個類的Class對象在一個虛擬機中只有一個,所以類鎖也只有一個。
private static synchronized void synClass(){ }
volatile適用于只有一個線程寫,多個線程讀的場景,因為它只能確??梢娦浴?/p>ThreadLocal線程變量??梢岳斫鉃槭莻€map。類型Map<Thread,Integer>線程間協(xié)作。輪訓(xùn):難以保證及時性,資源開銷很大
等待通知
wait()對象上的方法notify() / notifyAll()對象上的方法。注意 應(yīng)該盡量使用notifyAll,使用notify因為有可能發(fā)生信號丟失的情況。
join()線程A,執(zhí)行了線程B的join方法,線程A必須要等待B完成了以后,線程A才能繼續(xù)自己的工作。yield()sleep()wait()nodify()對鎖影響
yield():線程在執(zhí)行yield()以后,持有的鎖是不會釋放的sleep():sleep()方法被調(diào)用以后,持有的鎖是不釋放的wait():調(diào)動方法之前,必須要持有鎖。調(diào)用了wait()方法以后,鎖就會被釋放,當(dāng)wait()方法返回的時候,線程會重新持有鎖notify():調(diào)動方法之前,必須要持有鎖,調(diào)用notify()方法本身不會釋放鎖