Java多线程 演示死锁的发生
发布日期:2021-06-30 13:12:05 浏览次数:2 分类:技术文章

本文共 1811 字,大约阅读时间需要 6 分钟。

文章目录

演示死锁的发生

如下的代码演示了死锁的发生.

在run方法中, flag等于1 的时候, 线程1 ,获得了锁1, 需要拿到锁2 .
flag等于2的时候, 线程2获得了锁2 ,需要拿到锁1,
创建两个线程的时候, 给线程1的flag赋值为1 , 线程2赋值为2.

这样创建线程, 启动线程的时候, 线程1 和2 分别拥有了锁1 和2 ,但是同时又需要拿到锁2和1 .

线程1和2也没有释放锁1和2. 这样就造成了相互等待锁资源,造成了死锁的发生.

package com.thread.background;/** * 类名称:DeadLockDemo * 类描述: 线程安全问题,演示死锁。 * * @author: https://javaweixin6.blog.csdn.net/ * 创建时间:2020/9/1 7:22 * Version 1.0 */public class DeadLockDemo implements Runnable {
int flag = 1; //两把锁 static Object o1 = new Object(); static Object o2 = new Object(); public static void main(String[] args) {
DeadLockDemo r1 = new DeadLockDemo(); DeadLockDemo r2 = new DeadLockDemo(); r1.flag=1; r2.flag=2; new Thread(r1,"thread1").start(); new Thread(r2,"thread2").start(); } @Override public void run() {
System.out.println(Thread.currentThread().getName()+ " flag = " + flag); if (flag == 1) {
//获取第一把锁 synchronized (o1) {
try {
Thread.sleep(1000L); } catch (InterruptedException e) {
e.printStackTrace(); } //获取第二把锁 synchronized (o2) {
System.out.println("1"); } } } if (flag == 2) {
//获取第一把锁 synchronized (o2) {
try {
Thread.sleep(1000L); } catch (InterruptedException e) {
e.printStackTrace(); } //获取第二把锁 synchronized (o1) {
System.out.println("2"); } } } }}

运行程序可以看到线程1和2 分别进入run方法打印了输出语句之后, 就进入了死锁的阶段.

控制台的红色按钮一直亮着 ,说明程序一直在运行中, 发生了死锁.

转载地址:https://javaweixin6.blog.csdn.net/article/details/108333257 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Java多线程 发布private对象逸出的演示
下一篇:Java多线程 a++线程问题 找出减少的地方

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2024年04月30日 23时39分46秒