Java基础:死锁示例
2015-12-19 21:02
543 查看
java多线程编程中,如果线程锁使用不当,就会产生死锁,以下是一个简单的死锁示例。
死锁分析:线程1占有locka,请求loackb,且在获得lockb前不会释放locka;线程2占有lockb,请求locka,且在获得locka前不会释放lockb。这就造成互相请求对方资源的僵局,任何一个线程都无法向前推进,进而产生锁。
public class DeadRunnable implements Runnable{ Object locka=new Object(); Object lockb=new Object(); boolean flag; public DeadRunnable(boolean flag) { super(); this.flag = flag; } public void setFlag(boolean flag) { this.flag = flag; } //嵌套锁,会产生死锁问题 @Override public void run() { if(flag){ while(true){ synchronized(locka){ System.out.println(Thread.currentThread().getName()+"....if locka"); synchronized(lockb){ System.out.println(Thread.currentThread().getName()+"....if lockb"); } } } }else{ while(true){ synchronized(lockb){ System.out.println(Thread.currentThread().getName()+"....else lockb"); synchronized(locka){ System.out.println(Thread.currentThread().getName()+"....else locka"); } } } } } }
import org.junit.Test; public class DeadLock { @Test public void testDeadLock(){ DeadRunnable d=new DeadRunnable(true); Thread t1=new Thread(d); Thread t2=new Thread(d); t1.start(); //主线程睡眠10毫秒,用来设置DeadRunnable的flag值 try { Thread.currentThread().sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } d.setFlag(false); t2.start(); } }
死锁分析:线程1占有locka,请求loackb,且在获得lockb前不会释放locka;线程2占有lockb,请求locka,且在获得locka前不会释放lockb。这就造成互相请求对方资源的僵局,任何一个线程都无法向前推进,进而产生锁。
相关文章推荐
- Struts 2 基本语法
- JAVA 清理垃圾文件简单实现
- Jdk1.7环境变量的配置
- java中的异常
- java(九)双重for循环
- java 注解
- 实战WEB 服务器(JAVA编写WEB服务器)
- java实现简单web服务器(分析+源代码)
- Java中常见的5种WEB服务器介绍
- Struts2基于注解的Action配置
- 一个例子让你了解Java反射机制
- Mac eclipse 连接 手机调试
- JAVA的Date类与Calendar类【转】
- 正则表达式
- PAT乙级测试题及JAVA参考例程
- 【Java EE 学习 78 上】【数据采集系统第十天】【Service使用Spring缓存模块】
- ArrayList LinkList Vector
- java web session+cookie实现用户自动登录
- java初始化顺序
- Spring 开启Annotation <context:annotation-config> 和 <context:component-scan>诠释及区别