zoukankan      html  css  js  c++  java
  • Java连载110-类锁、死锁、守护线程

    一、类锁

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

     

  • 相关阅读:
    Linux 软件安装
    大型网站架构设计原理(书的目录)
    Spring Cloud 学习笔记(二)——Netflix
    Spring Cloud 学习笔记(一)——入门、特征、配置
    RocketMQ与Kafka对比
    分布式开放消息系统(RocketMQ)的原理与实践(转)
    JavaScript Event Loop
    双向链表
    MutationObserver()观察者构造函数用法
    jsonp跨域
  • 原文地址:https://www.cnblogs.com/ruigege0000/p/12723605.html
Copyright © 2011-2022 走看看