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

死锁

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

锁顺序死锁

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

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的资源不够用了,有一个线程的优先级比较低,总有比他高优先级的在运行,就轮不到他。这种问题现在应该基本不会见到了。

活锁

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

时间: 2024-10-29 05:33:51

并发编程9-避免活跃度危害的相关文章

Java并发编程系列之一:并发机制的底层原理

前言 并发编程的目的是让程序运行更快,但是使用并发并不定会使得程序运行更快,只有当程序的并发数量达到一定的量级的时候才能体现并发编程的优势.所以谈并发编程在高并发量的时候才有意义.虽然目前还没有开发过高并发量的程序,但是学习并发是为了更好理解一些分布式架构.那么当程序的并发量不高,比如是单线程的程序,单线程的执行效率反而比多线程更高.这又是为什么呢?熟悉操作系统的应该知道,CPU是通过给每个线程分配时间片的方式实现多线程的.这样,当CPU从一个任务切换到另一个任务的时候,会保存上一个任务的状态,

并发编程(二):分析Boost对 互斥量和条件变量的封装及实现生产者消费者问题

请阅读上篇文章<并发编程实战: POSIX 使用互斥量和条件变量实现生产者/消费者问题>.当然不阅读亦不影响本篇文章的阅读. Boost的互斥量,条件变量做了很好的封装,因此比"原生的"POSIX mutex,condition variables好用.然后我们会通过分析boost相关源码看一下boost linux是如何对pthread_mutex_t和pthread_cond_t进行的封装. 首先看一下condition_variable_any的具体实现,代码路径:/

Python中利用生成器实现的并发编程

  这篇文章主要介绍了简单介绍Python中利用生成器实现的并发编程,使用yield生成器函数进行多进程编程是Python学习进阶当中的重要知识,需要的朋友可以参考下 我们都知道并发(不是并行)编程目前有四种方式,多进程,多线程,异步,和协程. 多进程编程在python中有类似C的os.fork,当然还有更高层封装的multiprocessing标准库,在之前写过的python高可用程序设计方法中提供了类似nginx中master process和worker process间信号处理的方式,保

《GO并发编程实战》—— 原子操作

声明:本文是<Go并发编程实战>的样章,感谢图灵授权并发编程网站发布样章,禁止以任何形式转载此文. 我们已经知道,原子操作即是进行过程中不能被中断的操作.也就是说,针对某个值的原子操作在被进行的过程当中,CPU绝不会再去进行其它的针对该值的操作.无论这些其它的操作是否为原子操作都会是这样.为了实现这样的严谨性,原子操作仅会由一个独立的CPU指令代表和完成.只有这样才能够在并发环境下保证原子操作的绝对安全. Go语言提供的原子操作都是非侵入式的.它们由标准库代码包sync/atomic中的众多函

我为什么喜欢用C#来做并发编程

题记:就语言和运行时层面,C#做并发编程一点都不弱,缺的是生态和社区. 硅谷才女朱赟(我的家门)昨天发了一篇文章<为什么用 Java -- 关于并发编程>,让大家学习了Java中如何进行并发编程的一些基本知识.作为一个将近15年的.NET程序员,我觉得有必要给大家补充介绍一下C#进行并发编程的知识(当然不会太深入讲解).这篇文章无意进行技术比较,毕竟技术只是工具(大同小异,各有千秋),主要还是看用工具的人. 并发(英文Concurrency),其实是一个很泛的概念,字面意思就是"同时

Java并发编程相关面试问题

基础概念 1.什么是原子操作?在Java Concurrency API中有哪些原子类(atomic classes)? 原子操作(atomic operation)意为"不可被中断的一个或一系列操作" .处理器使用基于对缓存加锁或总线加锁的方式来实现多处理器之间的原子操作. 在Java中可以通过锁和循环CAS的方式来实现原子操作. CAS操作--Compare & Set,或是 Compare & Swap,现在几乎所有的CPU指令都支持CAS的原子操作. 原子操作是

推荐阅读Java并发性领域编程最值得一读的力作《JAVA并发编程实践》

我的第一次之给<JAVA并发编程实践>写推荐序英文书名:Java Concurrency in Practice 中文书名:JAVA并发编程实践 这是一本入围17届Jolt大奖的书,虽然最终他没有获奖,但是这只是与政治有关的.:) 推荐序原文如下: http://book.csdn.net/bookfiles/398/10039814644.shtml 在汗牛充栋的 Java 图书堆中,关于并发性的书籍却相当稀少,然而这本书的出现,将极大地弥补了这一方面的空缺.即使并发性编程还没进入到您的 J

缓冲区-java NIO服务器并发编程

问题描述 java NIO服务器并发编程 各位CSDN的编程大神们!求帮忙,求解决方案!跪求! 最近开发一个基于nio的服务器端程序(也包括客户端),实现一个多人(很多人)并发进行即时通讯的东东...发觉这个NIO太难搞了,不过总算还是能够建立一个连接发发"hello world"之类的东西,但是问题来了.由于NIO是针对缓冲区进行操作的,所有数据只能够写入到缓冲区中(我用的是byteBuffer),完了我自定义了一个数据包的格式,如下:|包头一个字节|包长度四个字节|包内容长度可变|

《Java 7并发编程实战手册》第六章并发集合

由人民邮电出版社出版的<Java 7并发编程实战手册>终于出版了,译者是俞黎敏和申绍勇,该书将于近期上架.之前并发编程网组织翻译过此书,由于邮电出版社在并发网联系他们之前就找到了译者,所以没有采用并发网的译稿,但邮电出版社将于并发网展开合作,发布该书的样章(样章由并发网挑选,你也可以回帖告诉我们你想看哪一章的样章),并组织赠书活动回馈给活跃读者.活动详情请时刻关注并发网的微博和微信(微信号:ifeves),最后祝各位用餐愉快!:) 本章将介绍下列内容: 使用非阻塞式线程安全列表 使用阻塞式线程