java并发编程时遇到的死锁

我们在面对并发编程的时候可能会采用线程池和信号量来限制对资源的使用,但这些被限制的行为可能会导致资源死锁,java应用程序无法从死锁中恢复过来,因此在设计时一定要排除那些可能导致死锁出现的条件。
当一个线程永远的持有一个锁,并且其他线程都尝试获取这个锁时,这时他们会被阻塞。
比如,线程A持有锁L并想获得锁M的同时,线程B持有锁M并尝试获得锁L,那么这两个线程将会永远的等待下去,这个就是简单的死锁形式,抱死。
数据库在这个方面的处理比JVM要强大很多,在执行一个事物Transaction时候可能需要获取多个锁,并持有这些锁,因此两个事物间很可能发生死锁。数据库的服务器不会让这种情况发生,数据库通过在表示等待关系的有向图中搜索循环来检测到一组事物是否发生死锁,会选择一个牺牲者,牺牲者会放弃它持有的资源,其他事物会继续进行,应用程序可以重新执行被强制终止的事务,这个事务就可以成功的完成,因为跟他竞争的资源的事物都已经完成了。
以下就是一个简单的锁顺序死锁

public class LeftRightLock {
    private final Object left = new Object();
    private final Object right = new Object();

    public void leftRight(){
        synchronized (left){
            synchronized (right){
                System.out.print("持有left,请求right。");
            }
        }
    }

    public void rightLeft(){
        synchronized (right){
            synchronized (left){
                System.out.print("持有right,请求left");
            }
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,860评论 25 709
  • 1.解决信号量丢失和假唤醒 public class MyWaitNotify3{ MonitorObject m...
    Q罗阅读 924评论 0 1
  • 1、竞态条件: 定义:竞态条件指的是一种特殊的情况,在这种情况下各个执行单元以一种没有逻辑的顺序执行动作,从而导致...
    Hughman阅读 1,338评论 0 7
  • 《像画家一样思考》一本韩国人金在骏写的书,是借画画激发我们的创造力。设计了二十周的主题课程,从线、面、心、意图、我...
    雪糕冰脚阅读 511评论 0 1
  • 拖延症晚期,都开学那么久了才把寒假的图传上来 多图(多。。。吗?) 续上文,来发一波成果图 这是给同学刻的姓名印,...
    流星雨lxy阅读 414评论 1 0