转载自 java多线程中的死锁、活锁、饥饿、无锁都是什么鬼?

死锁、活锁、饥饿是关于多线程是否活跃出现的运行阻塞障碍问题,如果线程出现了这三种情况,即线程不再活跃,不能再正常地执行下去了。

死锁

死锁是多线程中最差的一种情况,多个线程相互占用对方的资源的锁,而又相互等对方释放锁,此时若无外力干预,这些线程则一直处理阻塞的假死状态,形成死锁。

举个例子,A同学抢了B同学的钢笔,B同学抢了A同学的书,两个人都相互占用对方的东西,都在让对方先还给自己自己再还,这样一直争执下去等待对方还而又得不到解决,老师知道此事后就让他们相互还给对方,这样在外力的干预下他们才解决,当然这只是个例子没有老师他们也能很好解决,计算机不像人如果发现这种情况没有外力干预还是会一直阻塞下去的。

活锁

活锁这个概念大家应该很少有人听说或理解它的概念,而在多线程中这确实存在。活锁恰恰与死锁相反,死锁是大家都拿不到资源都占用着对方的资源,而活锁是拿到资源却又相互释放不执行。当多线程中出现了相互谦让,都主动将资源释放给别的线程使用,这样这个资源在多个线程之间跳动而又得不到执行,这就是活锁。

饥饿

我们知道多线程执行中有线程优先级这个东西,优先级高的线程能够插队并优先执行,这样如果优先级高的线程一直抢占优先级低线程的资源,导致低优先级线程无法得到执行,这就是饥饿。当然还有一种饥饿的情况,一个线程一直占着一个资源不放而导致其他线程得不到执行,与死锁不同的是饥饿在以后一段时间内还是能够得到执行的,如那个占用资源的线程结束了并释放了资源。

无锁

无锁,即没有对资源进行锁定,即所有的线程都能访问并修改同一个资源,但同时只有一个线程能修改成功。无锁典型的特点就是一个修改操作在一个循环内进行,线程会不断的尝试修改共享资源,如果没有冲突就修改成功并退出否则就会继续下一次循环尝试。所以,如果有多个线程修改同一个值必定会有一个线程能修改成功,而其他修改失败的线程会不断重试直到修改成功。之前的文章我介绍过JDK的CAS原理及应用即是无锁的实现。

可以看出,无锁是一种非常良好的设计,它不会出现线程出现的跳跃性问题,锁使用不当肯定会出现系统性能问题,虽然无锁无法全面代替有锁,但无锁在某些场合下是非常高效的。

java多线程中的死锁、活锁、饥饿、无锁都是什么鬼?相关推荐

  1. Java多线程中的死锁问题

    Java程序基本都要涉及到多线程,而在多线程环境中不可避免的要遇到线程死锁的问题.Java不像数据库那么能够检测到死锁,然后进行处理,Java中的死锁问题,只能通过程序员自己写代码时避免引入死锁的可能 ...

  2. java多线程同步与死锁_浅析Java多线程中的同步和死锁

    Value Engineering 1基于Java的多线程 多线程是实现并发机制的一种有效手段,它允许编程语言在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间相互独立,且与进程一样拥有独立 ...

  3. 多线程中的死锁举例与分析(转)

    1. 一个特殊构造的程序 考虑下面这个专门为说明多线程中的死锁现象而构造的程序: import java.util.LinkedList;public class Stack {public stat ...

  4. java多线程中的join方法详解

    java多线程中的join方法详解 方法Join是干啥用的? 简单回答,同步,如何同步? 怎么实现的? 下面将逐个回答. 自从接触Java多线程,一直对Join理解不了.JDK是这样说的:join p ...

  5. Java多线程中的ThreadLocal,可继承,可修改

    Java多线程中的ThreadLocal,可继承,可修改. package test;import java.util.Date;public class InheritableThreadLocal ...

  6. Java多线程中使用ReentrantLock、synchronized加锁 简单举例

    Java多线程中使用ReentrantLock.synchronized加锁 简单举例 public class Demo {final static Lock lock = new Reentran ...

  7. java 多线程的单例模式,Java多线程中的单例模式两种实现方式

    Java多线程中的单例模式 一.在多线程环境下创建单例 方式一: package com.ietree.multithread.sync; public class Singletion { priv ...

  8. Java多线程中static变量的使用

    Java中 没处理好同步 导致两个线程同时为一个static变量赋值 会导致什么后果? Java中 没处理好同步 导致两个线程同时为一个static变量赋值 会导致什么后果?仅仅是多耗资源还是会引发异 ...

  9. java避免活锁.死锁的解决,死锁 活锁 饥饿 出现原因及解决方案

    文章目录 死锁 概念 死锁示例 为什么会出现死锁呢? 如何解决死锁呢? 解决死锁代码实现 活锁 概念 活锁示例: 如何解决活锁呢? 饥饿 概念 如何解决饥饿呢? 死锁 概念 死锁:一组互相竞争资源的线 ...

最新文章

  1. Ring Tone Manager on Windows Mobile
  2. 突发!又一个程序员在东南亚出事了...
  3. 逻辑模型三要素-数据结构
  4. python_redis模块
  5. LeetCode 52.N-Queens II
  6. Codeforces Round #547 (Div. 3) D
  7. 大学文科计算机考试大纲,(文科)大学计算机信息技术课程考核大纲(文科)介绍.doc...
  8. win10网卡高级属性配置图解_简单设置,win10再也不会断网了
  9. 递增三元组蓝桥杯c语言,蓝桥-递增三元组-蓝桥
  10. [leetcode] 150. 逆波兰表达式求值
  11. 云服务器的规格配置该怎么选?
  12. 十三届蓝桥杯国赛 内存空间 python 满分答案
  13. CNKI知网如何批量下载论文
  14. 35岁鹅厂员工失业后嚎啕大哭...年轻新鹅分享省钱秘诀,每月除了房租水电,其他吃喝玩乐基本白嫖公司......
  15. vue 中监听document.body.scrollTop 值总为0的解决方法
  16. 秩和检验(秩的概念,秩和检验法)
  17. Xcode自带的instrument中的Automation实现自动化测试简单使用
  18. Sharding-Sphere的应用性能监控实践
  19. Before you can run VMware, several modules must be compiled and loaded into the running kernel.
  20. L2-021 点赞狂魔 c++结构体排序

热门文章

  1. [JavaWeb-JavaScript]JavaScript变量
  2. [蓝桥杯2016决赛]路径之谜
  3. 多队列 部分队列没有包_记一次TCP全队列溢出问题排查过程
  4. HTML怎么去除数组的重复元素,js去除数组中重复元素并排序
  5. oracle 取英文排序,Oracle中中文、数字,英文混杂形式的字段进行排序的方法
  6. P6329 【模板】点分树 | 震波
  7. 2020 区域赛(沈阳) M. United in Stormwind fwt + sosdp
  8. Mod, Or and Everything HDU - 6950
  9. 牛客题霸 [ 最小的K个数] C++题解/答案
  10. Secret Code(原题和变形题)