直接上代码

public class Test3 {

    public static Object fromAccount = new String("1");
public static Object toAccount = new String("2");
/*public static Object toAccount = new String("1");*/
public static Object tieLock = new Object(); public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
exchange();
} catch(Exception e) {
e.printStackTrace();
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
fromAccount = new String("2");
toAccount = new String("1");
while (true) {
try {
exchange();
} catch(Exception e) {
e.printStackTrace();
}
}
}
}).start();
} public static void exchange() throws Exception {
int fromHashCode = System.identityHashCode(fromAccount);
int toHashCode = System.identityHashCode(toAccount);
if(fromHashCode < toHashCode) {
synchronized (fromAccount) {
synchronized (toAccount) {
System.out.println(1);
}
}
} else if(fromHashCode > toHashCode) {
synchronized (toAccount) {
synchronized (fromAccount) {
System.out.println(2);
}
}
} else {
synchronized (tieLock) {
synchronized (fromAccount) {
synchronized (toAccount) {
System.out.println(3);
}
}
}
}
} }

测试方式:

使用现在的代码可以测试调用exchange(a,b)和exchange(b,a)的死锁问题.

另外一个自己看吧.

我个人的理解是

第一种,主要是来判断,当一个线程调用exchange(a,b),另一个调用exchange(b,a),此时,只判断a和b的大小,哪个小,就先锁小的那个,再锁另外一个
第二种,相同hash值时,还没弄懂.我的个人猜测是,非常特别的情况,两个线程同时进入,可能恰好构成死锁,如果加上第三个.
fromAccount编号1,toAccount编号2,tieLock3
我举个例子,只有两个锁时,
第一个线程的执行顺序是1-2
第二个线程的执行顺序是2-1
在极少数情况,恰好第一个线程取得锁1,还没来得及取得锁2,第二个线程取得锁2,然后还没来得及取得锁1,这样会死锁.
如果有三个锁.
顺序要不是1-2-3,要不是1-3-2,没有构成环形,这种应该就能避免了.具体解释等以后我理解了再写.
 纯属个人理解,如有问题,欢迎大家指正,非常感谢!

java解决动态的锁顺序死锁的方案的更多相关文章

  1. 【JAVA并发编程实战】8、锁顺序死锁

    package cn.study.concurrency.ch10; public class Account { private String staffAccount; //账号 private ...

  2. JAVA并发编程学习笔记------锁顺序死锁

    一.需求描述: 将资金从一个账户转移到另一个账户. 二.程序实现: (1)账户类: public class Account { private long account; public Accoun ...

  3. [编织消息框架][JAVA核心技术]动态代理应用10-水平扩展方案

    服务分为系统服务同用户服务两种 水平扩展是基于系统服务,而拆分方式又有几种方案,按数据跟业务情况来做决策 1.每个服务独立存储(图1):每个服务只负责一个或多个领域实体存储,A服务不能直接修改B服务的 ...

  4. Java并发编程-各种锁

    安全性和活跃度通常相互牵制.我们使用锁来保证线程安全,但是滥用锁可能引起锁顺序死锁.类似地,我们使用线程池和信号量来约束资源的使用, 但是缺不能知晓哪些管辖范围内的活动可能形成的资源死锁.Java应用 ...

  5. JUC 并发编程--05, Volatile关键字特性: 可见性, 不保证原子性,禁止指令重排, 代码证明过程. CAS了解么 , ABA怎么解决, 手写自旋锁和死锁

    问: 了解volatile关键字么? 答: 他是java 的关键字, 保证可见性, 不保证原子性, 禁止指令重排 问: 你说的这三个特性, 能写代码证明么? 答: .... 问: 听说过 CAS么 他 ...

  6. 分门别类总结Java中的各种锁,让你彻底记住

    概念 公平锁/非公平锁 公平锁是指多个线程按照申请锁的顺序来获取锁. 非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁.有可能,会造成优先级反转或者饥 ...

  7. Java - "JUC" ReentrantLock获取锁

    [Java并发编程实战]-----“J.U.C”:ReentrantLock之一简介 ReentrantLock介绍 ReentrantLock是一个可重入的互斥锁,又被称为“独占锁”. 顾名思义,R ...

  8. java高并发之锁的使用以及原理浅析

    锁像synchronized同步块一样,是一种线程同步机制.让自Java 5开始,java.util.concurrent.locks包提供了另一种方式实现线程同步机制——Lock.那么问题来了既然都 ...

  9. java 并发——内置锁

    坚持学习,总会有一些不一样的东西. 一.由单例模式引入 引用一下百度百科的定义-- 线程安全是多线程编程时的计算机程序代码中的一个概念.在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同 ...

随机推荐

  1. I.MX6 U-boot编译找不到用户目录

    /**************************************************************************** * I.MX6 U-boot编译找不到用户目 ...

  2. VS 一些用法设置

    /************************************************************************ * VS 一些用法设置 * 说明: * 最近要用到C ...

  3. Mybatis用到的设计模式和常用类原理

    功能:将java对象映射城sql语句,将结果集转化成java对象.将容易变化的放在配置文件中,不变的通过Mybatis管理. 完成:1.根据JDBC规范建立数据库的连接: 2.通过反射打通java对象 ...

  4. 动态点分治入门 ZJOI2007 捉迷藏

    传送门 这道题好神奇啊……如果要是不带修改的话那就是普通的点分治了,每次维护子树中距离次大值和最大值去更新. 不过这题要修改,而且还改500000次,总不能每改一次都点分治一次吧. 所以我们来认识一个 ...

  5. Python基础第十天

    一.内容

  6. vue 子组件 索引 ref

    尽管有props和events,但是有时任然需要在javascript中直接访问子组件.为此可是使用ref为子组件指定一个索引ID. <div id="parent"> ...

  7. 2-11 tensorflow常量变量定义

    D:\Users\ZHONGZHENHUA\Anaconda3\envs\tensorflow\Lib\site-packages\tensorflow https://developer.nvidi ...

  8. log4j没有作用,druid的日志信息还打印在控制台的解决办法

    log4j没有实现类,需引入slf4j实现

  9. 真正认识 realloc 的工作方式(转载)

    转自:http://www.cnblogs.com/ren54/archive/2008/11/20/1337545.html realloc 用过很多次了.无非就是将已经存在的一块内存扩大. cha ...

  10. bzoj 4137 [FJOI2015]火星商店问题【CDQ分治+可持久化trie】

    其实我不太清楚这个应该叫CDQ分治还是整体二分 参考:http://blog.csdn.net/lvzelong2014/article/details/78688727 一眼做法是线段树套可持久化t ...