Java并发编程的艺术 记录(一)

模拟死锁

1package com.gjjun.concurrent; 2 3/** 4 * 模拟死锁,来源于《Java并发编程的艺术》 5 * @Author gjjun 6 * @Create 2018/8/12 7 **/ 8public class DeadLockDemo { 9 10 private static String A = "A"; 11 private static String B = "B"; 12 13 public static void main(String[] args) { 14 15 DeadLockDemo deadLockDemo = new DeadLockDemo(); 16 deadLockDemo.deadLock(); 17 } 18 19 /** 20 * 下面代码将发生死锁,原因是线程0将A资源锁定,之后线程1将B资源锁定, 21 * 之后线程1调用A资源,但是是锁定状态,所以等待A资源释放,但是A资源在2s后需要B 22 * 资源,但是B资源却等待A资源释放,所以形成了相互依赖。 23 * 24 * 可以在控制行输入命令 jps,查看类的id,之后使用jstack id查看是否发生了死锁 25 * 26 * 27 * 避免死锁的方式: 28 * 1.避免一个线程同时获取多个锁。 29 * 2.避免一个线程同时占用多个资源,尽量保证一个锁一个资源。 30 * 3.尝试使用定时锁,使用lock.tryLock(timeout)来代替使用 31 * 4.对于数据库锁,加锁和解锁必须在一个数据库连接池里。 32 */ 33 private void deadLock() { 34 Thread thread1 = new Thread(new Runnable() { 35 @Override 36 public void run() { 37 synchronized (A) { 38 try { 39 System.out.println("A"); 40 Thread.currentThread(); 41 Thread.sleep(2000); 42 } catch (InterruptedException e) { 43 e.printStackTrace(); 44 } 45 synchronized (B) { 46 System.out.println("1"); 47 } 48 } 49 } 50 }); 51 Thread thread2 = new Thread(new Runnable() { 52 @Override 53 public void run() { 54 synchronized (B) { 55 try { 56 System.out.println("B"); 57 Thread.currentThread(); 58 Thread.sleep(2000); 59 } catch (InterruptedException e) { 60 e.printStackTrace(); 61 } 62 synchronized (A) { 63 System.out.println("2"); 64 } 65 } 66 } 67 }); 68 thread1.start(); 69 thread2.start(); 70 } 71}

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

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Java日期时间API系列31

  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前

Java爬虫之JSoup使用教程

title:Java爬虫之JSoup使用教程date:201812248:00:000800update:201812248:00:000800author:mecover:https://imgblog.csdnimg.cn/20181224144920712(https://www.oschin