并发编程9-避免活跃度危害

简介: <div class="markdown_views"><h2 id="死锁">死锁</h2><p>线程等待资源,形成一个环路就会造死锁。 <br>数据库中事务也可能造成死锁,但是事务会自动选择一个杀死,保证另外的运行,线程可没有这么自动</p><h3 id="锁顺序死锁">锁顺序死锁</h3><p>直接上代码 <br>这种死锁,只要保持锁的顺序就不会发生

死锁

线程等待资源,形成一个环路就会造死锁。
数据库中事务也可能造成死锁,但是事务会自动选择一个杀死,保证另外的运行,线程可没有这么自动

锁顺序死锁

直接上代码
这种死锁,只要保持锁的顺序就不会发生

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

    public void left(){
        synchronized (left){
            synchronized (right){
                // dosomething
            }
        }
    }

    public void right(){
        synchronized (right){
            synchronized (left){
                // dosomething
            }
        }
    }
}

动态锁顺序死锁

如下,因为不能保证传入参数的顺序性:

public class TestCallable {
    public void left(Object left, Object right){
        synchronized (left){
            synchronized (right){
                // dosomething
            }
        }
    }
}

如下可以避免死锁:

public class TestCallable {
    public void left(Object left, Object right){
        if(System.identityHashCode(left) > System.identityHashCode(right)){
            synchronized (left){
                synchronized (right){
                    // dosomething
                }
            }
        }else if(System.identityHashCode(right) > System.identityHashCode(left)){
            synchronized (right){
                synchronized (left){
                    // dosomething
                }
            }
        }else{
            synchronized (this){
                // dosomething
            }
        }
    }
}

另外还有可能协作对象间的死锁。这个就防不胜防了。具体问题需要具体分析。不过其实大多数情况下是没有必要给程序加锁的,也就不会出现问题。

资源等待死锁

线程A用到两个数据库连接,持有一个了,不释放,又去拿另外一个,结果池里面没有了,就会造成死锁。
或者是线程A的运行结束依赖于池中B线程,B线程等待A执行结束才会开始执行,就会造成死锁。

避免死锁

定时锁

用显示锁的tryLock来替代内部锁,超时无法获得锁后会抛出异常,重新交回控制权

其他活跃度危险

饥饿

通常是因为CPU的资源不够用了,有一个线程的优先级比较低,总有比他高优先级的在运行,就轮不到他。这种问题现在应该基本不会见到了。

活锁

尽管不会阻塞,但是任然不能执行,因为其会重复相同的操作,永远忙碌状态。
比如一个线程执行失败,然后被加到队尾,然后又执行,又失败。

相关文章
|
26天前
|
存储 缓存 Java
金石原创 |【JVM盲点补漏系列】「并发编程的难题和挑战」深入理解JMM及JVM内存模型知识体系机制(1)
金石原创 |【JVM盲点补漏系列】「并发编程的难题和挑战」深入理解JMM及JVM内存模型知识体系机制(1)
34 1
|
7月前
|
Java 开发者
Alibaba刚上线的JDK源码整合手册,瞬间遭受百万源码开发者追捧
随着JDK的不断迭代更新,国内的一些一线互联网大厂都安耐不住了,都开始了自己内部的JDK源码内卷,其中最受大家关注的阿里最先发布了一份号称21年最新的JDK源码整合手册,瞬间受到大批的源码开发者追捧一时风头无两!!!!
|
8月前
|
缓存 Java 编译器
并发编程Bug源头
并发编程Bug源头
30 1
|
10月前
多线程的安全问题
多线程的安全问题
43 0
|
12月前
|
存储 安全 Java
吃透Java线程安全问题(下)
吃透Java线程安全问题(下)
|
12月前
|
安全 Java 调度
吃透Java线程安全问题(上)
吃透Java线程安全问题(上)
|
监控 安全 数据安全/隐私保护
在开源代码的时候该如何避免安全风险的发生?
作为开发者来讲,不管是在实际开发中使用开源项目,还是直接投身于开源的贡献中,关于开源相关的内容想必都有自己独到的见解。开源与开发者息息相关,可能有的开发者会觉得不使用开源项目,自己就与开源无关了?这种想法是片面的,因为就算没有在实际开发中使用开源项目,但是在实际开发中肯定会用到一些第三方的插件,那么能保证这些插件没有用到开源的内容么?所以,开源与每一位开发者都有联系。
208 2
在开源代码的时候该如何避免安全风险的发生?
|
存储 安全 算法
重生之我在人间敲代码_Java并发基础_安全性、活跃性以及性能问题
并发编程中我们需要注意的问题有很多,很庆幸前人已经帮我们总结过了,主要有三个方面,分别是:安全性问题、活跃性问题和性能问题。
|
存储 缓存
【高并发】导致并发编程频繁出问题的“幕后黑手”
工作了3年的小菜同学,平时在公司只是做些CRUD的常规工作,这次,出去面试被面试官一顿虐啊!尤其是并发编程的知识简直就是被吊打啊。小菜心有不甘,回来找自己工作经验非常丰富的朋友大冰来帮助自己提升并发编程的知识,于是便有了接下来的一系列小菜学并发的文章。
【高并发】导致并发编程频繁出问题的“幕后黑手”
|
安全 物联网
你不可不知的安全问题与9大趋势
当今安全问题与9大趋势,根据文章阿里安全资深总监张玉东解读安全技术9大新趋势整理。1、首先是国内企业安全意识觉醒力度不够、安全投入不足;2、其次,很多企业的安全做法相对于瞬息万变的黑灰产形态,仍然比较传统;3、安全行业参与各方尚未建立起有效协同;4、数字时代,企业在准备不足的情况下,就要面临数据安全保护的巨大挑战;5、即将到来的5G/IPv6/IoT时代将深刻改变互联网的安全格局。
1201 0

热门文章

最新文章