Java连载110-类锁、死锁、守护线程
程序员文章站
2022-04-29 23:00:57
一、类锁 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.欢迎关注微信公众号:傅里叶变换,个人公众号,仅用于学习交流,后台回复”礼包“,获取大数据学习资料