- 浏览: 93111 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (133)
- jQuery (11)
- XML (3)
- 组件 (1)
- JAVA (20)
- WEB (3)
- SPRING (6)
- HIBERNATE (5)
- AJAX (2)
- JS (1)
- JAVA webservice (1)
- Ditu (1)
- WEBSITE (1)
- HIBERNATE ANNOTATION (1)
- 排序 (1)
- TCP_NODELAY (1)
- ConvertUtils (1)
- Logistics (1)
- SQL SERVER 中identity (4)
- sql server (35)
- MYSQL (1)
- Eclipse (6)
- ORACLE (6)
- FLEX (4)
- notepad++ (0)
- UNION ALL (1)
- JUnit (3)
- SQL 异常处理 (1)
- @@trancount (1)
- IOS (1)
- ORA-02266 (1)
- REMOTE DESKTOP (0)
- HTML 优化 (1)
- CRLF (1)
- SQL Server Sequence (1)
最新评论
-
zjuttsw:
看的舒服
重要的hashcode equals转载
错序死锁(Locking-ordering deadlock)是众多死锁情形中的一种,造成这种死锁的主要原因就是某些并发操作需要获取一个锁集合或其子集。
如下面的代码:
import java.util.concurrent.TimeUnit;
public class LockOrderingDeadLock {
private Object lock1 = new Object();
private Object lock2 = new Object();
public void op1() {
synchronized(lock1) {
System.out.println("do sth in op1 with lock1...");
try {
TimeUnit.SECONDS.sleep(1);
} catch (Exception e) {}
System.out.println("after sleep in op1");
synchronized(lock2) {
System.out.println("do sth in op1 with lock2...");
}
}
}
public void op2() {
synchronized(lock2) {
System.out.println("do sth in op2 with lock2...");
try {
TimeUnit.SECONDS.sleep(1);
} catch (Exception e) {}
System.out.println("after sleep in op2");
synchronized(lock1) {
System.out.println("do sth in op2 with lock1...");
}
}
}
public static void main(String... args) {
final LockOrderingDeadLock test = new LockOrderingDeadLock();
new Thread() {
public void run() {
test.op1();
}
}.start();
new Thread() {
public void run() {
test.op2();
}
}.start();
}
}
在op1中,获取锁lock1后做了一些操作,而op2同时获取lock2后进行一些操作,当op1需要lock2的时候,op2尚未释放lock2,而op2一直等待lock1才能完成操作,于是就造成了死锁。示例中的死锁情况比较直观,两个锁是在同一个类中。而实际情况往往比这个复杂且难以发觉,如以下情形:
public void transferMoney(Account fromAccount,
Account toAccount,
DollarAmount amount)
throws InsufficientFundsException {
synchronized (fromAccount) {
synchronized (toAccount) {
if (fromAccount.getBalance().compareTo(amount) < 0)
throw new InsufficientFundsException();
else {
fromAccount.debit(amount);
toAccount.credit(amount);
}
}
}
}
当同时有两个调用:
A: transferMoney(myAccount, yourAccount, 10);
B: transferMoney(yourAccount, myAccount, 20);
A操作需要先个myAccount加锁,后给yourAccount加锁;而B要先给yourAccount加锁,后给myAccount加锁,这又带来了锁顺序问题,而锁的顺序是由外界输入确定的,这种就难以发觉。
解决这类死锁的根本思想就是设法保证多个锁的加锁顺序一致。
如下面的代码:
import java.util.concurrent.TimeUnit;
public class LockOrderingDeadLock {
private Object lock1 = new Object();
private Object lock2 = new Object();
public void op1() {
synchronized(lock1) {
System.out.println("do sth in op1 with lock1...");
try {
TimeUnit.SECONDS.sleep(1);
} catch (Exception e) {}
System.out.println("after sleep in op1");
synchronized(lock2) {
System.out.println("do sth in op1 with lock2...");
}
}
}
public void op2() {
synchronized(lock2) {
System.out.println("do sth in op2 with lock2...");
try {
TimeUnit.SECONDS.sleep(1);
} catch (Exception e) {}
System.out.println("after sleep in op2");
synchronized(lock1) {
System.out.println("do sth in op2 with lock1...");
}
}
}
public static void main(String... args) {
final LockOrderingDeadLock test = new LockOrderingDeadLock();
new Thread() {
public void run() {
test.op1();
}
}.start();
new Thread() {
public void run() {
test.op2();
}
}.start();
}
}
在op1中,获取锁lock1后做了一些操作,而op2同时获取lock2后进行一些操作,当op1需要lock2的时候,op2尚未释放lock2,而op2一直等待lock1才能完成操作,于是就造成了死锁。示例中的死锁情况比较直观,两个锁是在同一个类中。而实际情况往往比这个复杂且难以发觉,如以下情形:
public void transferMoney(Account fromAccount,
Account toAccount,
DollarAmount amount)
throws InsufficientFundsException {
synchronized (fromAccount) {
synchronized (toAccount) {
if (fromAccount.getBalance().compareTo(amount) < 0)
throw new InsufficientFundsException();
else {
fromAccount.debit(amount);
toAccount.credit(amount);
}
}
}
}
当同时有两个调用:
A: transferMoney(myAccount, yourAccount, 10);
B: transferMoney(yourAccount, myAccount, 20);
A操作需要先个myAccount加锁,后给yourAccount加锁;而B要先给yourAccount加锁,后给myAccount加锁,这又带来了锁顺序问题,而锁的顺序是由外界输入确定的,这种就难以发觉。
解决这类死锁的根本思想就是设法保证多个锁的加锁顺序一致。
发表评论
-
JAVA 的checked异常和unchecked异常
2015-03-03 17:23 610JAVA 的checked异常和unchecked异常 (20 ... -
good upload
2013-08-01 12:48 331http://spring-geli.iteye.com/bl ... -
文件上传
2013-08-01 12:01 245http://zhangjunhd.blog.51cto.co ... -
collection排序
2013-06-17 16:52 488http://www.cnblogs.com/huangfox ... -
ServerSocket 与 Socket的区别
2013-04-03 08:08 648http://www.cnblogs.com/mareymar ... -
java基础:关于java流与文件操作
2013-04-03 00:36 631http://www.blogjava.net/haizhig ... -
NumberFormatException异常
2013-03-17 21:48 9851. 对应String类型的对象 ... -
Heep and Stack
2013-02-20 16:52 562java中堆(heap)和堆栈(s ... -
Java中HashMap的工作机制
2013-01-12 19:50 0http://java.chinaitlab.com/adva ... -
java中去掉字符串中间的空格
2013-01-12 19:23 8981.JAVA中去掉空格 2. 3.1. S ... -
JAVA高级
2013-01-12 19:23 684http://java.chinaitlab.com/adva ... -
Java中的克隆(Clone)机制
2013-01-12 19:19 598http://java.chinaitlab.com/adva ... -
java设计模式示例
2013-01-12 19:13 739http://blog.csdn.net/chmask/art ... -
Thread
2013-01-12 18:20 665Java:使用wait()与notify()实现线程间协作 2 ... -
hashCode equal避免的几个误区
2012-12-28 11:45 1809对于hashcode方法和equals ... -
重要的hashcode equals转载
2012-12-28 10:26 732http://www.iteye.com/topic/2571 ... -
JAVA HashCode
2012-12-28 10:14 622http://www.cnblogs.com/batys/ar ... -
java bingfa
2012-12-27 14:29 691http://www.iteye.com/topic/3665 ... -
Good book about java
2012-12-27 14:05 558http://extjs2.iteye.com/blog/79 ... -
内部类
2012-12-04 18:51 755Java代码 内部类的分类:成员内部类,静态内部类,局部内 ...
相关推荐
死锁1deadlock---马克-to-win java视频的详细描述与介绍
死锁2deadlock---马克-to-win java视频的详细的描述与介绍
有关表死锁的详细图片 博文链接:https://meteor-1988.iteye.com/blog/1568695
该代码是操作系统中为了避免死锁而编写的银行家算法。
NULL 博文链接:https://edwin-chen.iteye.com/blog/440645
这个项目收集了一些常见的 MySQL 死锁案例,大多数案例都来源于网络,并对其进行分类汇总,试图通过死锁日志分析出每种死锁的原因,还原出死锁现场。 实际上,我们在定位死锁问题时,不仅应该对死锁日志进行分析,还...
docker mysql_一些常见的mysql死锁案例_笔记记录
操作系统课程设计 死锁的避免---银行家算法
5. 银行家算法算例 4. 安全性算法 3. 银行家算法(Pi进程提出资源请求Requesti ) 4. 安全性算法 3. 银行家算法(Pi进程提出资源请求Re
什么go-deadlock 为 sync.(RW)Mutex 提供了 (RW)Mutex 的替代品。 如果您创建频道的意大利面,它将不起作用。 仅互斥体。安装go get github.com/sasha-s/go-deadlock/...用法 import "github....
阵列服务器集群中的死锁问题比较讨厌;而其与性能之间的PK是个人类无奈的话题。需找一些相应的适中机制比较好玩。
个人简介围城文章分类全部亚虎娱乐(123)学习笔记(13)职场&人生(2)杂谈(0)编译&调试(12)IT 基础(24)C 基础(5)未分配的亚虎娱乐(0)文章
进程调度与死锁-作业 帮你复习所学的东西
DeadLock查找死锁的位置及解决 DeadLock查找死锁的位置及解决
一本面向想要了解SQL Server并发性以及如何解决过多的阻塞或死锁问题的DBA和开发人员的书。
解决死锁问题的三种方法:预防死锁,检测死锁及避免死锁。
检查 Sql Server的阻塞和死锁--------------------------------------------
用C语言实现死锁检测
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction 由于开发任务紧急,只是暂时规避了一下,但是对触发死锁的原因和相关原理不甚了解,于是这几天一直在查阅相关资料,总结...
2015 Oracle 技术嘉年华(OTN)分会场11何登成 - 管中窥豹——MySQL(InnoDB)死锁分析之道