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

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


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


死锁


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


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


活锁


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


饥饿


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


无锁


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


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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330371.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HDU2159(完全背包)

Problem Descrption 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级。现在的问题是,xhd升掉最后一级还需n的经验值&#xff…

(转)接口幂等性

转自: https://blog.csdn.net/mingwulipo/article/details/91443355 1、接口调用存在的问题 现如今我们的系统大多拆分为分布式SOA,或者微服务,一套系统中包含了多个子系统服务,而一个子系统服务往往会去调用另一个服务&#x…

高级java必须清楚的概念:原子性、可见性、有序性

转载自 高级java必须清楚的概念:原子性、可见性、有序性 原子性、可见性、有序性是多线程编程中最重要的几个知识点,由于多线程情况复杂,如何让每个线程能看到正确的结果,这是非常重要的。 原子性 原子性是指一个线程的操作是不能…

背包问题总结

参考链接: http://www.cnblogs.com/fengty90/p/3768845.html http://blog.csdn.net/mu399/article/details/7722810 http://blog.csdn.net/xiaowei_cqu/article/details/8191808 http://blog.csdn.net/insistgogo/article/details/11176693 原文:https:…

(转)数据库可靠性/可用性、稳定性RTO/RPO

转 https://blog.csdn.net/luke_wang/article/details/78145517; 在灾难恢复方面,目前业界公认有三个目标值得努力。一是恢复时间,企业能忍受多长时间没有 IT,处于停业状态;二是网络多长时间能够恢复;三是…

HDU2059(DP)

Problem Descrption 据说在很久很久以前,可怜的兔子经历了人生中最大的打击——赛跑输给乌龟后,心中郁闷,发誓要报仇雪恨,于是躲进了杭州下沙某农业园卧薪尝胆潜心修炼,终于练成了绝技,能够毫不休息得以恒…

Java多线程之守护线程实战

转载自 Java多线程之<<守护线程>>实战定义什么是守护线程&#xff1f;与守护线程相对应的就是用户线程&#xff0c;守护线程就是守护用户线程&#xff0c;当用户线程全部执行完结束之后&#xff0c;守护线程才会跟着结束。也就是守护线程必须伴随着用户线程&#x…

转:集群和分布式的区别

转自&#xff1a; https://blog.csdn.net/shuaipu813/article/details/52083289 集群 多台服务器组成的一组计算机&#xff0c;作为一个整体存在&#xff0c;向用户提供一组网络资源&#xff0c;这些单个的服务器就是集群的节点。 集群拥有以下两个特点&#xff1a; 1. 可…

如何quot;优雅quot;地终止一个线程?

转载自 如何"优雅"地终止一个线程&#xff1f;我们的系统肯定有些线程为了保证业务需要是要常驻后台的&#xff0c;一般它们不会自己终止&#xff0c;需要我们通过手动来终止它们。我们知道启动一个线程是start方法&#xff0c;自然有一个对应的终止线程的stop方法&a…

HDU1087

Problem Descrption Nowadays, a kind of chess game called “Super Jumping! Jumping! Jumping!” is very popular in HDU. Maybe you are a good boy, and know little about this game, so I introduce it to you now. The game can be played by two or more than two p…

转-BFF调研-1

转自&#xff1a; https://blog.csdn.net/duola8789/article/details/89332064 前端开发中存在的难问题 多端应用&#xff0c;不同类型客户端对数据、API有个性化的需求服务聚合&#xff0c;单一后端为多个前端团队提供接口&#xff0c;导致跨团队协作低效&#xff0c;资源协…

JDK8新特性之Stream流

转载自 JDK8新特性之Stream流 是什么是Stream流 java.util.stream.Stream Stream流和传统的IO流&#xff0c;它们都叫流&#xff0c;却是两个完全不一样的概念和东西。 流可以简单的说是处理数据集合的东西&#xff0c;可以申明式流式API来处理集合&#xff0c;而不是写一个…

(转)贫血和富血

转自&#xff1a; https://blog.csdn.net/t0404/article/details/51865174 贫血vs富血 我们来回顾一下。在企业架构模式中&#xff0c;业务层的实现一般有两种模式&#xff1a;一种是事务角本模式&#xff08;Transaction script&#xff09;&#xff0c;另一种是领域模型模式…

JDK8的排序大法!!

转载自 屌炸天&#xff0c;JDK8的排序大法&#xff01;&#xff01; 今天总结了下JDK中排序的方法&#xff0c;包括JDK8中强大的lambda表达式及函数式接口运用&#xff0c;不废话&#xff0c;请看下面示例。 public class Test {public static void main(String[] args) {Lis…

康复题11

定义一个二维数组&#xff1a; int maze[5][5] {0, 1, 0, 0, 0,0, 1, 0, 1, 0,0, 0, 0, 0, 0,0, 1, 1, 1, 0,0, 0, 0, 1, 0,}; 它表示一个迷宫&#xff0c;其中的1表示墙壁&#xff0c;0表示可以走的路&#xff0c;只能横着走或竖着走&#xff0c;不能斜着走&#xff0c;要求…

JDK8新特性之函数式接口

转载自 JDK8新特性之函数式接口 什么是函数式接口 先来看看传统的创建线程是怎么写的 Thread t1 new Thread(new Runnable() {Overridepublic void run() {System.out.println("t1");} }); t1.start(); 再来看看使用了函数式接口是怎么写的 Thread t2 new Thre…

hashCode和identityHashCode的区别你知道吗?

转载自 hashCode和identityHashCode的区别你知道吗&#xff1f;hashCode 关于hashCode参考之前的文章&#xff0c;点击参考之前文章。 identityHashCode identityHashCode是System里面提供的本地方法&#xff0c;java.lang.System#identityHashCode。 /*** Returns the same ha…

转:drop、truncate和delete的区别与选择

转自&#xff1a; https://blog.csdn.net/shadow_zed/article/details/78252494 &#xff08;1&#xff09;日志与事务 1.delete语句执行删除的过程是每次从表中删除一行&#xff0c;并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作。 2.truncate tab…

Java高级篇——深入浅出Java类加载机制

转载自 Java高级篇——深入浅出Java类加载机制类加载器简单讲&#xff0c;类加载器ClassLoader的功能就是负责将class文件加载到jvm内存。类加载器分类从虚拟机层面讲分为两大类型的类加载器&#xff0c;一是Bootstrap Classloader即启动类加载器&#xff08;C实现&#xff09;…

康复题21

For a positive integer n lets define a function f: f(n)   - 1  2 - 3  ..  ( - 1)nn Your task is to calculate f(n) for a given integer n. Input The single line contains the positive integer n (1 ≤ n ≤ 1015). Output Print f(n) in a …