zoukankan      html  css  js  c++  java
  • 线程死锁代码

     
    /**
     * @author hollis
     */
    public class JStackDemo {
        public static void main(String[] args) {
            Thread t1 = new Thread(new DeadLockclass(true));//建立一个线程
            Thread t2 = new Thread(new DeadLockclass(false));//建立另一个线程
            t1.start();//启动一个线程
            t2.start();//启动另一个线程
        }
    }
    class DeadLockclass implements Runnable {
        public boolean falg;// 控制线程
        DeadLockclass(boolean falg) {
            this.falg = falg;
        }
        public void run() {
            /**
             * 如果falg的值为true则调用t1线程
             */
            if (falg) {
                while (true) {
                    synchronized (Suo.o1) {
                        System.out.println("o1 " + Thread.currentThread().getName());
                        synchronized (Suo.o2) {
                            System.out.println("o2 " + Thread.currentThread().getName());
                        }
                    }
                }
            }
            /**
             * 如果falg的值为false则调用t2线程
             */
            else {
                while (true) {
                    synchronized (Suo.o2) {
                        System.out.println("o2 " + Thread.currentThread().getName());
                        synchronized (Suo.o1) {
                            System.out.println("o1 " + Thread.currentThread().getName());
                        }
                    }
                }
            }
        }
    }
    
    class Suo {
        static Object o1 = new Object();
        static Object o2 = new Object();
    }
    import org.springframework.stereotype.Component;
    
    
    @Component
    public class SynchronizedTest {
    
          private static final Object lockA = new Object();
          private static final Object lockB = new Object();
    
          
          
          /**
           * ThreadA先获取lockA,在获取lockB
           */
          private static class ThreadA extends java.lang.Thread {
    
            @Override
            public void run() {
              // 获取临界区A
              synchronized (lockA) {
                System.out.println("get lockA success");
                // 模拟耗时操作
                try {
                    Thread.currentThread().setName("线程A");
                  Thread.sleep(500);
                } catch (InterruptedException e) {
                  e.printStackTrace();
                }
                // 获取临界区B
                synchronized (lockB) {
                  System.out.println("get lockB success");
                }
              }
            }
          }
    
          /**
           * ThreadB先获取lockB,在获取lockA
           */
          private static class ThreadB extends java.lang.Thread {
    
            @Override
            public void run() {
              // 获取临界区A
              synchronized (lockB) {
                System.out.println("get lockB success");
                // 模拟耗时操作
                try {
                    Thread.currentThread().setName("线程B");
                  Thread.sleep(500);
                } catch (InterruptedException e) {
                  e.printStackTrace();
                }
                // 获取临界区B
                synchronized (lockA) {
                  System.out.println("get lockA success");
                }
              }
            }
          }
          
          static {
              new ThreadA().start();
              new ThreadB().start();
          }
        }
  • 相关阅读:
    【spring cloud】spring cloud服务发现注解之@EnableDiscoveryClient与@EnableEurekaClient
    【IntelliJ IDEA】idea导入项目只显示项目中的文件,不显示项目结构
    【IntelliJ IDEA】idea显示工具栏
    笔记:git基本操作
    Spring Boot中使用AOP统一处理Web请求日志
    Spring Boot应用的后台运行配置
    RSA加密
    Java汉字md5值不一致问题
    如何判断一个请求是不是ajax请求
    SpringBoot拦截器中service或者redis注入为空的问题
  • 原文地址:https://www.cnblogs.com/shihaiming/p/11459953.html
Copyright © 2011-2022 走看看