zoukankan      html  css  js  c++  java
  • Java并发编程的艺术 记录(一)

    模拟死锁

    package com.gjjun.concurrent;
    
    /**
     * 模拟死锁,来源于《Java并发编程的艺术》
     * @Author gjjun
     * @Create 2018/8/12
     **/
    public class DeadLockDemo {
    
        private static String A = "A";
        private static String B = "B";
    
        public static void main(String[] args) {
    
            DeadLockDemo deadLockDemo = new DeadLockDemo();
            deadLockDemo.deadLock();
        }
    
        /**
         * 下面代码将发生死锁,原因是线程0将A资源锁定,之后线程1将B资源锁定,
         * 之后线程1调用A资源,但是是锁定状态,所以等待A资源释放,但是A资源在2s后需要B
         * 资源,但是B资源却等待A资源释放,所以形成了相互依赖。
         *
         * 可以在控制行输入命令 jps,查看类的id,之后使用jstack id查看是否发生了死锁
         *
         *
         * 避免死锁的方式:
         * 1.避免一个线程同时获取多个锁。
         * 2.避免一个线程同时占用多个资源,尽量保证一个锁一个资源。
         * 3.尝试使用定时锁,使用lock.tryLock(timeout)来代替使用
         * 4.对于数据库锁,加锁和解锁必须在一个数据库连接池里。
         */
        private void deadLock() {
            Thread thread1 = new Thread(new Runnable() {
                @Override
                public void run() {
                    synchronized (A) {
                        try {
                            System.out.println("A");
                            Thread.currentThread();
                            Thread.sleep(2000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        synchronized (B) {
                            System.out.println("1");
                        }
                    }
                }
            });
            Thread thread2 = new Thread(new Runnable() {
                @Override
                public void run() {
                    synchronized (B) {
                        try {
                            System.out.println("B");
                            Thread.currentThread();
                            Thread.sleep(2000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        synchronized (A) {
                            System.out.println("2");
                        }
                    }
                }
            });
            thread1.start();
            thread2.start();
        }
    }

    下面是使用jstack命令查看的死锁状态,红色框内是死锁发生的类文件及行号。

  • 相关阅读:
    馨梦ASP服务器|馨梦ASP服务器V2014.7官方版下载
    类和对象的关系
    eclipse找不到或无法加载主类
    注释的最佳位置
    java软件开发
    使用MySqlHelper类查询并显示数据
    使用System.Web.HttpUtility.UrlEncode提示HttpUtility不是Web成员
    VB.net打印指定文件-(目前是打印文件名)
    馨梦ASP服务器|馨梦ASP服务器V2017.7官方版下载
    VB.net将中文转为URLencode问题
  • 原文地址:https://www.cnblogs.com/liter7/p/9463072.html
Copyright © 2011-2022 走看看