一般来说,死锁产生的原因是因为获取锁的顺序不一致,所以如果有顺序的将锁写入程序内。就可以解决死锁,但是如果锁是某个方法的入参,那么就会造成动态死锁问题,比如说你设置了两把锁,分别为方法的两个入参a,b,锁的顺序也在方法内实现了,先锁a,再锁b,此时有两个线程A,B,A传入a->x对象,b->y对象;B传入a->y对象,b->x对象,线程A进入方法后锁住了第一把锁x对象准备获取y锁的时候,线程B锁住了y对象准备获取x锁,这样就会造成动态死锁,你无法控制外部的传参。
解决方法1:使用hashcode,为了避免对象重写hashcode,使用identityHashCode方法算两个传入对象的hash值,每次先锁的对象都是传进来的对象取identityHashCode方法算出来的值小的,后锁的都是大的。(这样可以写出来一个if else),如果出现hash冲突,就再设置一个自己定义的static的锁对象,先用这把static锁锁住保证只有一个线程进入该方法的顺序锁阶段,随后随便设定锁入参a,b即可,因为你保证了只有一个线程操作这个阶段。

    private static Object tieLock = new Object();public void deadLockTest(Object a, Object b) {int hashA = System.identityHashCode(a);int hashB = System.identityHashCode(b);if (hashA < hashB) {synchronized (a) {System.out.println("锁住了小的准备获取大的");synchronized (b) {System.out.println("获取到了hash大的");}}} else if (hashB < hashA) {synchronized (b) {System.out.println("锁住了小的准备获取大的");synchronized (a) {System.out.println("获取到了hash大的");}}} else {synchronized (tieLock){synchronized (a){synchronized (b){}}}}}

解决办法2:
使用显示锁里的trylock方法,得不到锁的话就进行释放

java中动态顺序死锁问题相关推荐

  1. Java中活锁和死锁有什么区别?

    Java中活锁和死锁有什么区别? 活锁:一个线程通常会有会响应其他线程的活动.如果其他线程也会响应另一个线程的活动,那么就有可能发生活锁.同死锁一样,发生活锁的线程无法继续执行.然而线程并没有阻塞-- ...

  2. Java中动态加载字节码的方法 (持续补充)

    文章目录 Java中动态加载字节码的方法 1.利用 URLClassLoader 加载远程class文件 2.利用 ClassLoader#defineClass 直接加载字节码 2.1 类加载 - ...

  3. Java中如何避免死锁呢?

    转自: Java中如何避免死锁呢? 下文笔者讲述java中避免死锁的方法分享,如下所示 避免死锁的方法:不使用synchronized这个显式的锁,而采用信号量控制资源,可被多少线程访问当设置资源只可 ...

  4. Java中动态获取项目根目录和tomcat的绝对路径

    序言 在开发过程中经常会用到读写文件,其中就必然涉及路径问题.使用固定的绝对路径当然很方便,但会导致程序的可移植性差,比如在代码中写死了要在E盘建一个文件,而移植后的环境中木有E盘,那就只能改代码:又 ...

  5. 在Java中动态传参调用Python脚本

    最近,又接触到一个奇葩的接口,基于老板不断催促赶时间的情况下,在重写java接口和复用已有的python脚本的两条路中选择了后者,但是其实后者并没有好很多,因为我是一个对python的认识仅限于其名称 ...

  6. Java中动态代理的两种方式JDK动态代理和cglib动态代理以及区别

    视频功能审核通过了,可以看视频啦!记得点关注啊~ 注意:因为网络原因,视频前一两分钟可能会比较模糊,过一会儿就好了 记得点关注啊,视频里的wx二维码失效了,wx搜索:"聊5毛钱的java&q ...

  7. Java中动态调用setter以及getter

    0x00 前言 对于非专业程序员的安全人员来说,因为没有代码项目的积累,很多知识体系都不完善,所以有必要在一些常用的内容进行学习的总结. 在很多的调用链中都会用到**"动态调用setter以 ...

  8. java中动态代理实现机制

    v前言: 代理模式是常用的java设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关 ...

  9. java中哲学家就餐死锁_哲学家就餐问题与死锁总结

    死锁的四个条件: (1) 互斥条件:一个资源每次只能被一个进程使用. (2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放. (3) 不剥夺条件:进程已获得的资源,在末使用完之前 ...

最新文章

  1. mysql 重要监控参数_mysql 的重要参数,监控需要
  2. oracle 数据不可恢复,Oracle数据恢复:错误叠加导致灾难不可恢复解决办法
  3. python订单管理系统功能_订单管理系统有哪些功能?
  4. uvalive4838(凸包+重心)
  5. Android网络框架OK3,Android网络框架---OkHttp3
  6. FastDFS整合SpringBoot - 实现service
  7. Ant Design Pro 2.0/umijs站点配置到非站点根目录下处理
  8. Go程序:利用命令行参数做四则运算
  9. 轻松scrum之旅 思维导图读书笔记
  10. swift 异常捕获try catch的使用
  11. 自己动手制作植物大战僵尸简单修改器
  12. BZOJ[1984]月下“毛景树” 树链剖分+线段树
  13. 每日刷题之数独简单版 AcWing 1613
  14. Linuxnbsp;用命令行打开docnbsp;pdf…
  15. 轩辕剑--资料集(五)
  16. Solr - Server
  17. 【ps】ps如何画直折线
  18. Mysql 多表联合更新
  19. 插入u盘需重启计算机,电脑一插u盘就重启的原因及其解决方案
  20. java-net-php-python-12ssm商家后台管理系统计算机毕业设计程序

热门文章

  1. Java黑皮书课后题第3章:**3.23(几何:点是否在矩形内)编写程序,提示用户输入点(x,y),然后检测该点是否在以原点为中心、宽为10、高为5的矩形中
  2. python 字节和字符串区别,Python中字节串和字符串,不是一个概念没有区别之分...
  3. PythonWeb开发教程(一),开发之前需要准备什么
  4. JavaScript原生对象属性和方法详解——String对象
  5. VS2010 Visual Assist X 的配合
  6. 跟燕十八学习PHP-第十五天-php增删改查表数据
  7. 高精度计时器(编程测试效率用)
  8. 【转】java string类的方法及说明
  9. 爱我少一点,我请求你
  10. Java Web安全编码