• Tags
  •         
  • www.breakyizhan.com
  •    
    这是Java并发编程原理,本文来了解一个非常重要的问题,就是我们的线程安全性问题。刚才了解的我们线程安全性问题之前,我们先了解一下关于线程所带来的风险这个问题,我们之前也提到过那么一回事,我们说线程不光有它的优势,同样它也会带来一定的风险。那么我们当时提到了三点,分别是
    • 第一点就是线程安全性问题;
    • 第二个是活跃性问题;
    • 第三个是性能问题;
    其实越是往上的它就越严重,其实越需要我们去解决。那么最后一个其实就是一个相对于相当于优化的这么一块。那么我们在了解线程安全性问题之前,一个是活跃性问题,一个是性能问题。最后来看安全性问题,我们先来看活跃性问题。

    Java多线程的活跃性问题

    首先,什么是活跃性问题呢?是活跃性问题,那么这个活跃性问题有多种形式,可能我这里说起来大家可能就理解了。
    • 死锁
    • 饥饿
    • 活锁

    Java多线程的死锁

    首先第一个是死锁,那么死锁在有一个非常经典的就是所谓的哲学家就餐的问题,对不对?说有五个哲学家,那么每个哲学家在吃饭的时候,分给他们每人一只筷子,每个人是一支不是一双,那么吃饭我们知道都得用一双筷子来进行吃饭,对不对?那么这些哲学家就是说他们在谈论这个问题的时候,在探讨哲学问题的时候,那么可能有些哲学家就饿了就吃饭,于是借用它旁边的这个人的筷子就组成了一对筷子,就可以吃饭了。如果一个哲学家左边或右边已经有人在使用筷子了,那么这个哲学家就必须等待,直到可得到必须的筷子。那么这种情况下是正常的,但是比如说我们的程序结果设计成了什么样子,每个人不聊哲学问题了,都在那吃饭,于是每个人都拿起了自己的手中的那双筷子,在等待着另外一个人放下筷子,结果每个人都不放,结果这五个哲学家最终就饿死了,这就是所谓的死锁问题,就是说干嘛呢?另外一个人手中有这个人所需要的资源,而另外一个人又有这个人手中所需要的资源,但这两个资源他们都不放,所以两个人都拿不到。都拿不到,这就是死锁问题。关于思索问题,就是说都需要对方的资源,但都不是放着就会遇到死锁。

    再比如:迎面开来的汽车A和汽车B过马路,汽车A得到了半条路的资源(满足死锁发生条件1:资源访问是排他性的,我占了路你就不能上来,除非你爬我头上去),汽车B占了汽车A的另外半条路的资源,A想过去必须请求另一半被B占用的道路(死锁发生条件2:必须整条车身的空间才能开过去,我已经占了一半,尼玛另一半的路被B占用了),B若想过去也必须等待A让路,A是辆兰博基尼,B是开奇瑞QQ的屌丝,A素质比较低开窗对B狂骂:快给老子让开,B很生气,你妈逼的,老子就不让(死锁发生条件3:在未使用完资源前,不能被其他线程剥夺),于是两者相互僵持一个都走不了(死锁发生条件4:环路等待条件),而且导致整条道上的后续车辆也走不了。(很粗鲁的相互竞争)

    Java多线程的饥饿

    什么是饥饿?给大家举过一例子。餐厅排队吃饭。餐厅排队吃饭,一个窗口很多学很多人来的排队。但这些人非常没有素质,非常没有礼貌。来了就插队,应急就在一窗口往外服务。那么来了就在那挤着,而且买上了饭他也不走。所以可能就有这么一个弱小的一个女生,死活就是挤不进去,于是就被饿死了。这就是饥饿。那么在我们的线程中,其实就是线程有优先级这么一个概念,那么有的线程的优先级高,有的线程的优先级低,那么优先级低的它有可能就一直得不到资金,就发生了也就所谓的饥饿问题。
    再比如:这是个独木桥(单进程),桥上只能走一个人,B来到时A在桥上,B等待;

    而此时比B年龄小的C来了,B让C现行(A走完后系统把进程分给了C),

    C上桥后,D又来了,B又让D现行(C走完后系统把进程分个了D)

    以此类推B一直是等待状态.

    Java的并发编程:多线程的活跃性的问题: 死锁,饥饿和活锁

    Java多线程的活锁

    那么还有最后一个活锁。这个活锁其实给大家举一个非常简单的这个例子,这个相当于什么呢?线程A和B都需要过桥(都需要使用进程),而都礼让不走(那到的系统优先级相同,都认为不是自己优先级高),就这么僵持下去.(很绅士,互相谦让)
    Java的并发编程:多线程的活跃性的问题: 死锁,饥饿和活锁
    那么我们发现其实这三个问题还是非常严重的,遇到了之后对不对?那么死锁相对来讲,检测还是比较好检测的,我们可以来看一下,当然我们我们这里不去举例子,只是给大家咱也不打开,也不是直接在这里边。我们知道有一个jconsole,对不对?那么这个工具就能够给我们提供一个检测死锁的这么一个工具,内部是已经起来了。。那么当它检测到死锁的时候,它能给我们提示,也就是说死锁相对来讲还是比较好检测的,但是对于饥饿和活锁,那么它的遇到这个问题就不太好进行检测了。

     
    转载请保留页面地址:https://www.breakyizhan.com/java/6616.html