Java一个简单的死锁例子

内容:一个简单的死锁例子,大概的思路:两个线程A和B,两把锁X和Y,现在A先拿到锁X,然后sleep()一段时间,我们知道sleep()是不会释放锁资源的。然后如果这段时间线程B拿到锁Y,也sleep()一段时间的话,那么等到两个线程都醒过来的话,那么将互相等待对方释放锁资源而僵持下去,陷入死锁。flag的作用就是让A和B获得不同的锁。

public class TestDeadLock {

	public void run() {
		MyThread mt = new MyThread();
		new Thread(mt, "张三").start();
		new Thread(mt, "李四").start();
	}

	class MyThread implements Runnable {
		private Object o1 = new Object();
		private Object o2 = new Object();
		private boolean flag = true;

		@Override
		public void run() {
			if (flag) {
				flag = false;
				synchronized (o1) {
					System.out.println(Thread.currentThread().getName() + " have o1");
					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					synchronized (o2) {
						System.out.println(Thread.currentThread().getName() + " have o2");
					}
				}
			} else {
				flag = true;
				synchronized (o2) {
					System.out.println(Thread.currentThread().getName() + " have o2");
					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					synchronized (o1) {
						System.out.println(Thread.currentThread().getName() + " have o1");
					}
				}
			}
		}
	}

	public static void main(String[] args) {
		new TestDeadLock().run();
	}
}
时间: 2024-10-25 22:55:04

Java一个简单的死锁例子的相关文章

一个简单的死锁例子

/** * 一个简单的死锁类 * 当DeadLock类的对象flag==1时(td1),先锁定o1,睡眠500毫秒 * 而td1在睡眠的时候另一个flag==0的对象(td2)线程启动,先锁定o2,睡眠500毫秒 * td1睡眠结束后需要锁定o2才能继续执行,而此时o2已被td2锁定: * td2睡眠结束后需要锁定o1才能继续执行,而此时o1已被td1锁定: * td1.td2相互等待,都需要得到对方锁定的资源才能继续执行,从而死锁. */ public class DeadLock imple

编写一个简单的jdbc例子程序

1 package it.cast.jdbc; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.ResultSet; 6 import java.sql.SQLException; 7 import java.sql.Statement; 8 9 public class Base { 10 11 public static void main(String[] args) th

使用Multiplayer Networking做一个简单的多人游戏例子-2/3(Unity3D开发之二十六)

猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/51007512 使用Multiplayer Networking做一个简单的多人游戏例子-1/3 使用Multiplayer Networking做一个简单的多人游戏例子-2/3 使用Multiplayer Networking做一个简单的多人游戏例子-3/3 7. 在网络中控制Player移动 上一篇中,玩家操

一个简单的KVO例子

一个简单的KVO例子. 两个界面,第一个界面显示名字和配偶(spouse)名字,第二个界面显示修改名字和配偶名字,返回时,将看到第一个界面的名字显示发生改变. 首先定义一个person类作为model. #import <Foundation/Foundation.h> @interface Person : NSObject @property (strong, nonatomic) NSString *name; @property (strong, nonatomic) NSString

一个简单的小例子让你明白c#中的委托-终于懂了!

模拟主持人发布一个问题,由多个嘉宾来回答这个问题. 分析:从需求中抽出Host (主持人) 类和Guests (嘉宾) 类. 作为问题的发布者,Host不知道问题如何解答.因此它只能发布这个事件,将事件委托给多个嘉宾去处理.因此在Host 类定义事件,在Guests类中定义事件的响应方法.通过多番委托的"+="将响应方法添加到事件列表中,最终 Host 类将触发这个事件.实现过程如下: 代码其实很少下面贴出来所有代码: QuestionArgs.cs view plaincopy to

一个简单的cmake例子

一个简单的cmake例子CMakeLists.txt,生成动态库文件,可以指定发布目录. 尚不支持: 1.交叉编译环境配置 2.添加依赖库 1 #在当前目录新建一个build目录,然后cd build:cmake .. 2 #这样的好处是,可以将cmake生成的内容,和源码文件分离 3 4 #定义好版本需求 5 cmake_minimum_required (VERSION 2.6) 6 #工程名字 7 project (Libtree) 8 #编译结果发布路径 9 set ( CMAKE_IN

Servlet学习教程(三)---- 一个简单的Servlet例子

我们用个最简单的Servlet例子来解说一下Servlet简单配置以及Servlet类实现类的写法. 第一,我们新建一个Dynamic Web Project,起名Servlet 点击NEXT,设置Default output folder 为Servlet/WebContent/WEB-INF/classes 第二,创建一个包,包名为Servlet,然后创建一个类名为WelcomeServlet类.(Servlet类当然缺少不了Servlet容器,请注意你的开发软件是否已经集成Servlet容

一个简单的springmvc例子 入门

一直是从事棋牌游戏,平常用的东西 大多数只是使用一些javase的一些 api对spring 这方面 用到的比较少,每次学了都忘,始终记不住.为了 更轻松学习springboot,从新学习了spring,学到springmvc记录一下学习过程,先从一个简单的例子入门. 首先说下springmvc:和Struts2 都是一个mvc的框架 属于spring 的后续产品 springmvc和Struts2的对比: 原文地址:https://www.cnblogs.com/920913cheng/p/1

一个简单的SignalR例子

本文介绍如何使用SignalR的Hub制作一个简单的点赞页面.不同浏览器(或者不同窗口)打开同一个页面,在任何一个页面点赞,所有页面同时更新点赞数. 1.使用Visual Studio Community 2013新建一个Web项目,选择空白模板. 2.使用NugGet安装SignalR. 3.添加Startup.cs. 代码如下. namespace SignalRDemo { public class Startup { public void Configuration(IAppBuild