JAVA死锁的写法
在java开发中,避免不了要加锁控制程序逻辑,但加锁有可能导致死锁,造成线程永远卡死在等待释放锁,后面的代码得不到执行;
在java里,一般是通过synchronized关键字加锁,在jdk1.5版本中新增了Lock接口显示的加锁,本文讨论用这两种方式实现死锁;
方式一:
public static void main(String[] args) {
Object lock1 = new Object();
Object lock2 = new Object();
ExecutorService service = Executors.newCachedThreadPool();
service.execute(() ->{
while (true){
synchronized (lock2){
synchronized (lock1){
System.out.println("Thread1");
}
}
}
});
service.execute(() ->{
while (true){
synchronized (lock1){
synchronized (lock2){
System.out.println("Thread2");
}
}
}
});
service.shutdown();
}
上面的代码开启了两个线程,两个线程都循环打印字符串,正常来说两个线程都会不断打印,但这里出现了死锁,导致两个线程都会打印停止,逻辑分析:两个线程执行到某一时刻,线程一执行到synchronized (lock2){这一句,获得了对象lock2上的锁,线程二执行到synchronized (lock1){这一句,获得了对象lock1上的锁,接下来,线程一需要执行synchronized (lock1){这一句尝试获取lock1的锁,由于lock1的锁被线程二占用,线程一等待线程二释放lock1的锁,这时线程二需要执行synchronized (lock2){这一句,尝试获取lock2上的锁,由于lock2上的锁被线程一占用,线程二等待线程一释放lock2上的锁,这样,两个线程互相等待释放锁,导致两个线程永远无法执行后面的代码,导致死锁;
方式二:
static final Lock LOCK1 = new ReentrantLock();
static final Lock LOCK2 = new ReentrantLock();
public static void main(String[] args) {
ExecutorService service = Executors.newCachedThreadPool();
service.execute(new PrintTask1(1));
service.execute(new PrintTask2(2));
}
static class PrintTask1 implements Runnable{
private int id = -1;
public PrintTask1(int i){
id = i;
}
@Override
public void run() {
while (true){
LOCK1.lock();
LOCK2.lock();
System.out.println("" + id);
LOCK2.unlock();
LOCK1.unlock();
}
}
}
static class PrintTask2 implements Runnable{
private int id = -1;
public PrintTask2(int i){
id = i;
}
@Override
public void run() {
while (true){
LOCK2.lock();
LOCK1.lock();
System.out.println("" + id);
LOCK2.unlock();
LOCK1.unlock();
}
}
}
方式二的代码属于显示加锁,使用了jdk1.5新增的Lock接口,与方式一类似,当两个线程执行到某一时刻,线程一执行了LOCK1.lock()获得了LOCK1锁,线程二执行了LOCK2.lock()获得了LOCK2锁,接下来两个线程又要互相等待对方释放锁,导致死锁。
JAVA死锁的写法的更多相关文章
- 实例详解 Java 死锁与破解死锁
锁和被保护资源之间的关系 我们把一段需要互斥执行的代码称为临界区.线程在进入临界区之前,首先尝试加锁 lock(),如果成功,则进入临界区,此时我们称这个线程持有锁:否则呢就等待,直到持有锁的线程解锁 ...
- Java死锁排查和Java CPU 100% 排查的步骤整理
================================================= 人工智能教程.零基础!通俗易懂!风趣幽默!大家可以看看是否对自己有帮助! 点击查看高清无码教程 == ...
- Java 链式写法
Java链式写法,子类继承父类的属性,也可以返回子类的对象,只是需要重写基类的Set方法 public class MyLS { public static void main(String[] ar ...
- 一文学会Java死锁和CPU 100% 问题的排查技巧
做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开 工欲善其事,必先利其器 00 本文简介 作为一名搞技术的程序猿或者是攻城狮,想必你应该是对下面这两个问题有所了解,说不定你在 ...
- Java死锁演示
Java死锁演示 在线程中嵌套获取锁导致死锁.思路,尽量不要嵌套获取锁. package com.mozq.demo.demo; public class DeadLockDemo { private ...
- 【性能优化】一文学会Java死锁和CPU100%问题的排查技巧
原文链接: 00 本文简介 作为一名搞技术的程序猿或者是攻城狮,想必你应该是对下面这两个问题有所了解,说不定你在实际的工作或者面试就有遇到过: 第一个问题:Java死锁如何排查和解决? 第二个问题:服 ...
- java 死锁演示
java 死锁演示 java死锁 模拟死锁生成 死锁是由多个线程竞争同一个资源导致 package com.feshfans; /** * 1. 本代码为展示 java 中死锁的产生 * 2. 死锁的 ...
- Java链式写法
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11613067.html Java 链式写法:详细看代码 package chain; /** ...
- Java 死锁以及如何避免?
Java 中的死锁是一种编程情况,其中两个或多个线程被永久阻塞,Java 死锁情况 出现至少两个线程和两个或更多资源. Java 发生死锁的根本原因是:在申请锁时发生了交叉闭环申请.
随机推荐
- suoi22 WRX知识树(dfs序)
把一条路径拆成到根的四个链(两端点.lca和fa[lca]),然后给dfs序中链的端点做单点修改.区间查询它的子树和再加上它原来的权值就可以了 #include<bits/stdc++.h> ...
- linux man命令
http://note.youdao.com/noteshare?id=98878258c6453f92117355deba8b8439
- CM记录-CDH大数据平台实施经验总结2016(转载)
CDH大数据平台实施经验总结2016(转载) 2016年负责实施了一个生产环境的大数据平台,用的CDH平台+docker容器的方式,过了快半年了,现在把总结发出来. 1. 平台规划注意事项 1.1 业 ...
- 51Nod 1684 子集价值 (平方和去括号技巧)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1684 题意: 新建一个位运算,求所有子集通过这个位运算后的答案的平方和是 ...
- [整]Android SlidingMenu Demo 环境搭建
1. 下载ActionBarSherlock https://github.com/JakeWharton/ActionBarSherlock 2. 下载SlidingMenu https://git ...
- javascript类式继承函数最优版
直接上代码: klass函数 var klass = function (Parent, props) { var Child, F, i; //1.新构造函数 Child = function () ...
- 强悍的CSS工具组合:Blueprint, Sass, Compass
掌握CSS是每个Web开发者的基本要求,虽然CSS本身并不复杂,但怎样写出支持所有主流浏览器(特别是IE)的CSS,以及在大型网站中如何有序地组织好CSS结构却是一个相当棘手的问题.我更多的是一个开发 ...
- Thinkpad X220 升级 Windows 10 后无线网卡消失问题
11年购买的Thinkpad X220从Win7升级到Win10后,用着还是挺顺手的,网络显示等一切正常,直到今天合上盖子电脑睡眠以后再次打开,wifi消失不见.重启,关机再开机,都没用,只显示有线网 ...
- C语言字节对齐 __align(),__attribute((aligned (n))),#pragma pack(n)【转】
转自:https://www.cnblogs.com/ransn/p/5081198.html 转载地址 : http://blog.csdn.net/21aspnet/article/details ...
- AUI-靠谱的移动前端框架
在如何开发出优秀的APICloud应用中ApiCloud官方推荐我们使用轻量级的框架AUI,针对AUI官网没有提供体验地址 特意编译了一个APP供给大家体验 aui官方地址:http://www.au ...