避免活跃性危险(第十章)

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

避免活跃性危险

在安全性与活跃性之间通常存在着某种制衡,我们使用加锁机制来确保线程安全,但如果过度地使用加锁,则可能导致“锁顺序死锁”。同样,我们使用线程池和信号量来限制对资源的使用,但这些被限制的行为可能会导致资源死锁。

1. 死锁

  • 锁顺序死锁:两个线程试图以不同的顺序来获得相同的锁,如果按照相同的顺序来请求锁,那么就不会出现循环的加锁依赖性,因此也就不会产生死锁。 在制定锁的顺序时,可以使用System.identityHashCode方法,该方法返回有Object.hashCode返回的值,通过比较大小等方法定义锁的顺序。在某些情况下,两个对象可能拥有相同的散列值,此时必须通过某种方法来决定锁的顺序,而这可能会重新引入死锁,为了避免这种情况,可以使用“加时赛”锁,在获得两个对象的锁之前,首先获得这个加时赛锁,从而保证每次只有一个线程以未知的顺序获得这两个锁。

  • 在协作对象之间发生的死锁 如果在持有锁的情况下调用某个外部方法,那么就需要警惕在协作对象之间发生死锁。 如果在持有锁时调用某个外部方法,那么将出现活跃性问题,在这个外部方法中可能会获得其他锁(这可能会产生死锁),或者阻塞时间过长,导致其他线程无法及时获得当前被持有的锁。

  • 开放调用 如果在调用某个方法时不需要持有锁,那么这种调用被称为开放调用。 在程序中应尽量使用开放调用。与那些在持有锁时调用外部方法的程序相比,更易于对依赖于开放调用的程序进行死锁分析。

  • 资源死锁

  1. 线程饥饿死锁。如果某些任务需要等待其他任务的结果,那么这些任务往往是产生线程饥饿死锁的主要来源。
  2. 有界线程池/资源池与相互依赖的任务不能一起使用

2. 死锁的避免与诊断

  1. 如果一个程序每次至多只能获得一个锁,那么就不会产生锁顺序死锁。
  2. 如果必须获取多个锁,那么在设计时必须考虑锁的顺序:尽量减少潜在的加锁交互数量,将获取锁时需要遵循的协议写入正式文档并始终遵循这些协议。
  3. 在使用细粒度锁的程序中,可以通过使用一种两阶段策略来检查代码中的死锁:首先,找出在什么地方将获取多个锁,然后对所有这些实例进行全局分析,从而确保它们在整个程序中获取锁的顺序都保持一致。
  4. 使用显示锁Lock类中的定时tryLock功能,在等待超过指定时间后tryLock会放回一个失败信息。

3. 其他活跃性危险

  1. 饥饿:当线程由于无法访问它所需要的资源而不能继续执行时,就发生了“饥饿”。

引发饥饿的最常见资源就是CPU时钟周期,如果在Java应用程序中对线程的优先级使用不当,或者在持有锁时执行一些无法结束的结构(例如无限循环,或者无限制地等待某个资源),那么也可能导致饥饿,因为其他需要这个锁的线程将无法得到它。线程优先级并不是一种直观的机制,而通过修改线程优先级所带来的效果通常也不明显。当提高某个线程的优先级时,可能不会起到任何作用,或者也可能使得某个线程的调度优先级高于其他线程,从而导致饥饿。

	通常,我们尽量不要改变线程的优先级。只要改变了线程的优先级,程序的行为就将与平台相关,并且会导致发生饥饿问题的风险。Thread.yield以及Thread.sleep的语义都是UB,JVM既可以将他们实现为空操作,也可以将它们视为线程调度的参考。
  1. 活锁(Livelock)

活锁是另一种形式的活跃性问题,该问题不会导致线程阻塞,但也不能继续执行。因为线程将不断重复执行相同的操作,而且总会失败。 活锁通常发生在处理事务消息的应用程序中:如果不能成功处理某个消息,那么消息处理机制将回滚整个事务,并将它重新放到队列的开头。当多个相互协作的线程都对彼此进行响应从而修改各自的状态,并使得任何一个线程无法继续执行时,就发生了活锁,在并发应用程序中,通过等待随机长度的时间和回退可以有效避免活锁的发生。

转载于:https://my.oschina.net/u/2602561/blog/1560129

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

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

相关文章

[poj2446]Chessboard

Description 给定一个mn的棋盘&#xff0c;上面有k个洞&#xff0c;求是否能在不重复覆盖且不覆盖到洞的情况下&#xff0c;用21的卡片完全覆盖棋盘。 Input 第一行有三个整数n,m,k(0<m,n<32, 0<k<mn)&#xff0c;m表示行数&#xff0c;n表示列数。 接下来k行&…

Ubuntu下编译内核

一、下载源代码和编译软件的准备 下载内核源代码&#xff1a;http://www.kernel.org/ 注意&#xff0c;点击2.6.25内核的F版&#xff0c;即完整版。 如果你懒得去网站点联接&#xff0c;运行下列命令&#xff1a; 代码:$cd ~$ wget http://www.kernel.org/pub/linux/kernel/v2.…

(10)C#偷懒的开始永无止境的循环?

本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新&#xff0c;包括别的语言以及实战都将使用对话的方式进行教学&#xff0c;基础编程语言教学适用于零基础小白&#xff0c;之后实战课程也将会逐步更新。 若…

活照片 android,活照片app安卓

活照片app是当前国内一款最新的图片处理应用软件&#xff0c;能帮助大家快速进行最新的手机拍照、处理功能&#xff0c;当前活照片app已经推出了安卓、苹果版本&#xff0c;可以帮助大家一键修图&#xff0c;将你的图片变得更加有趣。活照片app功能&#xff1a;它可以让你的照片…

Jwt隐藏大坑,通过源码揭秘

前言JWT是目前最为流行的接口认证方案之一&#xff0c;有关JWT协议的详细内容&#xff0c;请参考&#xff1a;https://jwt.io/introduction今天分享一下在使用JWT在项目中遇到的一个问题&#xff0c;主要是一个协议的细节&#xff0c;非常容易被忽略&#xff0c;如果不是自己遇…

GPS实验二:GPS接收机的使用

一、实习目的 1、了解GPS接收机的基本结构; 2、掌握GPS接收机的一般操作方法。 二、实习内容 1、了解GPS接收机的外观及主要构成单元; 2、学习GPS接收机的安装及静态测量的操作方法; 3、了解GPS接收机工作时的基本状态信息。 三、实习地点 选择视野开阔的场所,视场…

Android之解决CoordinatorLayout+AppBarLayout+CollapsingToolbarLayout+RecyclerView里面再嵌套RecyclerView滑动颤抖问题

1 问题 主页面用的是这种结构 CoordinatorLayout+AppBarLayout+CollapsingToolbarLayout+RecyclerView(里面再嵌套RecyclerView,然后这个RecyclerView再嵌套一个RecyclerView)上下滑动在AppBarLayout下面出现页面上下颤抖问题 2 分析 我的主页代码如下 <?xml versio…

文件传输基础——Java IO流

一、文件的编码 1 package com.study.io;2 3 4 /**5 * 测试文件编码6 */7 public class EncodeDemo {8 9 /** 10 * param args 11 * throws Exception 12 */ 13 public static void main(String[] args) throws Exception { 14 String s&quo…

keepalived实现nginx的高可用(双主模型)

实验环境&#xff1a;RS1&#xff1a;rip&#xff08;172.16.125.7&#xff09;&#xff0c;安装httpd软件包&#xff1b;RS2&#xff1a;rip&#xff08;172.16.125.8&#xff09;&#xff0c;安装httpd软件包&#xff1b;director1&#xff08;7-1.lcs.com&#xff09;&#…

【必懂C++】第一个程序当然是HelloWorld呀 01

作者简介 作者名&#xff1a;1_bit 简介&#xff1a;CSDN博客专家&#xff0c;2020年博客之星TOP5&#xff0c;蓝桥签约作者。15-16年曾在网上直播&#xff0c;带领一批程序小白走上程序员之路。欢迎各位小白加我咨询我相关信息&#xff0c;迷茫的你会找到答案。系列教程将会…

实现html5音乐的自动播放,html5中audio实现播放列表和自动播放

var count 43; //一共多少MP3文件var index 18.mp3; // 初始化播放那个文件window.onload function(){var audio new Audio();audio.preload true;audio.controls true;audio.loop false;audio.src index;document.body.appendChild(audio);audio.play();audio.addEven…

GPS实验三:GPS接收机野外数据采集

一、实习目的 1、掌握GPS接收机的使用方法; 2、学会量取天线高 3、掌握选点和埋设标志的原则 二、实习内容 1、了解GPS接收机的外观及主要构成单元; 2、学习GPS接收机的安装及静态测量的操作方法; 3、了解GPS接收机工作时的基本状态信息。 三、实习地点 选择视野开阔的…

打造操作系统根社区 统信Deepin屹立于浪潮之颠

如果把芯片比作信息系统的大脑的话&#xff0c;那么操作系统毫无疑问就是信息系统的灵魂。在过去几十年里&#xff0c;我国信息产业饱受“缺芯少魂”的困扰&#xff0c;国内市场基本被微软、谷歌、苹果、IBM、红帽等外商垄断。诚然&#xff0c;一些国内厂商推出过基于Fedora、u…

Androd之在图片右上角显示红色圆圈里面数字提醒

1 需求 在图片右上角显示红色圆圈里面数字提醒 2 效果如图 3 关键代码 item_loca.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_wid…

Bean

Bean spring中把一切配置到IOC容器(其实就是那个xml文件)里面的对象都称之为bean。 转载于:https://www.cnblogs.com/Renyi-Fan/p/7780935.html

html原样输出html代码

<xmp>********</xmp> 在网页上显示html代码标记<xmp></xmp>有时我们会将html代码显示在网页上,直接写会有问题, 如果我们将要显示的html代码放在<xmp></xmp>中就可以实现转载于:https://www.cnblogs.com/sign-ptk/p/5668442.html

ArcGIS实验教程——实验二十二:空间数据符号化

ArcGIS实验视频教程合集:《ArcGIS实验教程从入门到精通》(附配套实验数据) 一、实验描述 空间数据可视化是通过地图语言实现的,地图语言由符号、色彩和文字注记组成。 地图符号由形状不同、大小不一、色彩有别的图形和文字组成,是地图语言的图解部分。 符号化是以图形方…

【必懂C++】C++可真是个“固执”的小可爱 02

作者简介 作者名&#xff1a;1_bit 简介&#xff1a;CSDN博客专家&#xff0c;2020年博客之星TOP5&#xff0c;蓝桥签约作者。15-16年曾在网上直播&#xff0c;带领一批程序小白走上程序员之路。欢迎各位小白加我咨询我相关信息&#xff0c;迷茫的你会找到答案。系列教程将会…

html td显示隐藏,显示/隐藏Html TR/TD

如何从html表中显示/隐藏任何tr/td&#xff1f; 我应该可以隐藏表格中显示的任何tr/td。显示/隐藏Html TR/TDCountryUSASwedenNorwayInventory ID$123.23Cost$312.21Descriptionthis is a descriptionCSS&#xff1a;#tableEditor {position: absolute;left: 20px;top: 20px;pa…

Flutter之window系统下配置开发环境以及在Android Studio里面运行hello word

1 、window系统配置Flutter开发环境 1&#xff09;下载Flutter的SDK 如果电脑安装了Git&#xff0c;直接到https://github.com/flutter/flutter/这里下载&#xff0c;但是需要翻墙 git clone https://github.com/flutter/flutter.git 或者到lutter官网下载 https://flutter.d…