• 线程死锁代码


     
    /**
     * @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();
          }
        }
  • 相关阅读:
    ajax设置自定义请求头
    tomcat修改端口号
    下载文件(前端+后台)
    ajax请求超时判断(转载)
    js判断变量类型
    js中判断是否包含某个字符串
    Java将json字符串转成map
    Linux上安装设置mysql 5.7.24
    js格式化json字符串和json对象
    bootstrap中的data-toggle模态框相关
  • 原文地址:https://www.cnblogs.com/shihaiming/p/11459953.html
Copyright © 2020-2023  润新知