一、類鎖 1.類只有一個,所以鎖是類級別的,只有一個 package com.bjpowernode.java_learning; public class D110_1_ClassLock { public static void main(String[] args) throws Exce ...
一、類鎖
1.類只有一個,所以鎖是類級別的,只有一個
package com.bjpowernode.java_learning; public class D110_1_ClassLock { public static void main(String[] args) throws Exception{ Thread t1 = new Thread(new Processor110()); Thread t2 = new Thread(new Processor110()); t1.setName("t1"); t2.setName("t2"); t1.start(); //延遲,保證t1先執行 Thread.sleep(1000); //下麵的方法沒有等t1結束,因為這個方法不函數有鎖。如果這個方法加上synchronized就會等著t1結束。 t2.start(); //即使是實例化對象了,這個類鎖也是有效的,跟對象也沒有,底層用的是類鎖 } } class Processor110 implements Runnable{ public void run() { if("t1".equals(Thread.currentThread().getName())){ MyClass110.m1(); } if("t2".equals(Thread.currentThread().getName())){ MyClass110.m2(); } } } class MyClass110{ //synchronized添加到靜態方法上,線程執行方法的時候會找類鎖。 public synchronized static void m1() { try { Thread.sleep(10000); }catch (Exception e) { e.printStackTrace(); } System.out.println("m1......"); } public static void m2() { System.out.println("m2......"); } }
二、死鎖現象
package com.bjpowernode.java_learning; public class D110_2_DeadLock { public static void main(String[] args) throws Exception{ Object o1 = new Object(); Object o2 = new Object(); Thread t1 = new Thread(new T110(o1,o2)); Thread t2 = new Thread(new T111(o1,o2)); t1.start(); t2.start(); } } class T110 implements Runnable{ Object o1; Object o2; T110(Object o1,Object o2){ this.o1 = o1; this.o2 = o2; } public void run() { synchronized(o1) { try { Thread.sleep(500); }catch(Exception e) { e.printStackTrace(); } synchronized(o2) { System.out.println("沒有死鎖"); } } } } class T111 implements Runnable{ Object o1; Object o2; T111(Object o1,Object o2){ this.o1 = o1; this.o2 = o2; } public void run() { synchronized(o2) { try { Thread.sleep(500); }catch(Exception e) { e.printStackTrace(); } synchronized(o1) { System.out.println("沒有死鎖"); } } } }
兩個鎖死鎖了,沒辦法列印出來“沒有死鎖”這幾個字了。
三、守護線程和用戶線程
1.用戶線程:以上講的都是守護線程。
2.守護線程:其他所有的用戶線程結束,則守護線程退出;守護線程一般都是無限執行的;守護線程是這樣的,所有的用戶線程結束生命周期,守護線程才會結束生命周期,只有有一個用戶線程存在,那麼守護線程就不會結束,例如:java中著名的垃圾回收器就是一個守護線程,只有應用程式中的所有線程都結束,他才會結束。
package com.bjpowernode.java_learning; public class D110_3_DaemonThread { public static void main(String[] args) { Thread t1 = new Processer110_1(); t1.setName("守護線程"); //將t1這個用戶線程修改為守護線程 t1.setDaemon(true); t1.start(); try { Thread.sleep(1000); }catch(Exception e) { e.printStackTrace(); } for(int i=0;i<10;i++) { System.out.println(Thread.currentThread().getName()+"-->"+i); } } } class Processer110_1 extends Thread{ public void run() { while(true) { System.out.println(Thread.currentThread().getName()+"-->"); try { Thread.sleep(500); }catch(Exception e) { e.printStackTrace(); } } } }
可以看出來mainà9之後不會再進行列印列印守護線程,守護線程直接停止了。
四、源碼:
D110_1_ClassLock.java
D110_2_DeadLock.java
D110_3_DaemonThread.java
https://github.com/ruigege66/Java/blob/master/D110_1_ClassLock.java
https://github.com/ruigege66/Java/blob/master/D110_2_DeadLock.java
https://github.com/ruigege66/Java/blob/master/D110_3_DaemonThread.java
2.CSDN:https://blog.csdn.net/weixin_44630050
3.博客園:https://www.cnblogs.com/ruigege0000/
4.歡迎關註微信公眾號:傅里葉變換,個人公眾號,僅用於學習交流,後臺回覆”禮包“,獲取大數據學習資料