synchronized(someObject){ //對象鎖 }
當synchronize()語句執行完成。html
當synchronize()語句執行出現異常。java
當線程調用了wait()方法。併發
也就是說someObject 變量必須是privatejvm
一個線程在已經得到對象鎖的狀況下,能夠再次請求得到對象鎖。spa
線程run()方法結束以後,這個線程就是死的了。可能會被回收了。操作系統
http://blog.csdn.net/LonelyRoamer/article/details/7949969
.net
http://www.importnew.com/17770.html
線程
這裏所說的線程指程序執行過程當中的一個線程實體。JVM 容許一個應用併發執行多個線程。Hotspot JVM 中的 Java 線程與原生操做系統線程有直接的映射關係。當線程本地存儲、緩衝區分配、同步對象、棧、程序計數器等準備好之後,就會建立一個操做系統原生線程。Java 線程結束,原生線程隨之被回收。操做系統負責調度全部線程,並把它們分配到任何可用的 CPU 上。當原生線程初始化完畢,就會調用 Java 線程的 run() 方法。run() 返回時,被處理未捕獲異常,原生線程將確認因爲它的結束是否要終止 JVM 進程(好比這個線程是最後一個非守護線程)。當線程結束時,會釋放原生線程和 Java 線程的全部資源。code
如今理解守護進程就是 不影響主線程中止的線程。即便守護進程一直在執行,可是主進程中止了,而且jvm程序裏面只有守護進程,那麼jvm 將會退出。以下就是例子:
htm
public class DaemonTest { public static void main(String[] args) { new WorkerThread().start(); try { Thread.sleep(7500); } catch (InterruptedException e) { // handle here exception } System.out.println("Main Thread ending") ; }}class WorkerThread extends Thread { public WorkerThread() { // When false, (i.e. when it's a user thread), // the Worker thread continues to run. // When true, (i.e. when it's a daemon thread), // the Worker thread terminates when the main // thread terminates. setDaemon(true); } public void run() { int count = 0; while (true) { System.out.println("Hello from Worker "+count++); try { sleep(5000); } catch (InterruptedException e) { // handle exception here } } }}
運行結果爲: Hello from Worker 0 Hello from Worker 1 Main Thread ending
當守護進程打印了第一行的時候,
睡了5秒,
接下來醒了,打印第二行。
接着又睡了
主線程也睡了。
總結來看,就是守護進程其實不受主進程死活的影響。只要JVM活着,不過調用該守護進程的主進程死活,守護進程均可以運行,可是若是JVM死了,那守護進程也掛了。