欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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......");

  }

}

 

Java连载110-类锁、死锁、守护线程

二、死锁现象

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();

      }

    }

  }

}

Java连载110-类锁、死锁、守护线程

可以看出来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.欢迎关注微信公众号:傅里叶变换,个人公众号,仅用于学习交流,后台回复”礼包“,获取大数据学习资料

 Java连载110-类锁、死锁、守护线程