java社区活跃度_Java并发编程-活跃度问题

在讲问题前,我先说明一下什么是活跃度?

一个并发应用及时执行的能力称作活跃度。

我主要讲死锁问题,顺带介绍一下饥饿,弱响应性和活锁。

死锁

死锁这个词大家都听过,我先来罗列一下产生死锁的四个必要条件:

(1) 互斥条件:一个资源每次只能被一个进程使用。

(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。

(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。

(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

那程序里产生死锁的原因主要是:

(1)因为系统资源不足。

(2) 进程运行推进的顺序不合适。

(3) 资源分配不当等。

下面我再说一下在Java中常见的几种出现死锁的情况:

1.锁顺序死锁:

这个很简单,那就是两个线程通过不同的顺序请求多个相同的锁时发生的死锁。

举个例子:就是T1线程拥有L1锁,T2线程拥有L2锁,然后T1线程要L2锁,T2线程要L1锁,这时就发生死锁了。

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

2.动态的所顺序死锁:

有时候获得锁的顺序并不是固定的,比如说有些程序是根据传入的参数,来确定锁的顺序的。

0818b9ca8b590ca3270a3433284dd417.png

这个时候我们就得人为地控制顺序了,比如把哈希值大的当作第一个锁。

3.协作对象间的死锁:

有时候我们并没有显示地加锁,但调用别的类的方法时,该方法加了锁。所以我们编程时讲究开放调用,当调用的方法不需要持有锁时,我们称之为开放调用。其实这个问题主要提醒我们一点,那就是尽量缩小同步块的范围,不要随便就在方法上加个synchronized关键字。

4.资源死锁:

如资源连接池可能出现的分配与请求问题,线程饥饿死锁等。

那我们如何避免和诊断死锁呢?

首先尽量让每个线程一次至多获得一个锁。当然有时候业务需要,做不到这样,那我们就得控制锁的顺序来避免死锁。尽量进行开放调用。

当然除此以外,我们可以尝试使用定时的锁,如tryLock()方法等。当超时时,先放弃资源,并给出提示或抛出异常,当然也可以将给任务重新放进队列。

我们也可以通过线程转储来分析死锁。

饥饿

当线程访问它所需要的资源时却被永久拒绝,以至于不能再继续进行,这样就发生了饥饿。比如使用线程的优先级不当就可能造成饥饿。

弱响应性

如GUI线程执行耗时操作时,就会造成弱响应性问题。我们可以把耗时任务分载到后台线程来避免该问题。

活锁

活锁是线程中活跃度失败的另一种形式,尽管没有阻塞,线程却仍然不能继续,因为它不断重试相同的操作,却总是失败。

这类似于两个人在一个走廊中过路:Alphonse移到左边让Gaston通过,Gaston移到右边让Alphonse通过。由于他们被彼此阻塞,Alphonse移到右边,Gaston移到左边。他们又会发生阻塞,一直循环下去。。。  我个人理解,这和死循环差不多。

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

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

相关文章

python post 上传文件_如何在 Python 中模拟 post 表单来上传文件

展开全部发个以前用urllib2模块来做的62616964757a686964616fe4b893e5b19e31333335343366class HTTPError(urllib2.HTTPDefaultErrorHandler):def __init__(self):self.errMsg def getErrorMsg(self):return self.errMsgdef http_error_default(self, req, fp, code, msg, hdr…

java8 di_java8 多个list对象用lambda求差集操作

业务场景:调用同步接口获取当前全部有效账户,数据库已存在部分账户信息,因此需要筛选同步接口中已存在本地的帐户。调用接口获取的数据集合List list response.getData().getItems();本地查询出来的账户集合List towList accountRepository…

怎么抓python程序的包_如何在AWS上部署python应用程序

如何在AWS上部署python应用程序,学姐呕心沥血亲自总结,亲测有效,比网上看网上大把大把的文档要快得多!作者:蕾学姐亚马逊云计算服务(Amazon Web Services,缩写为AWS),由亚…

【Hadoop】Zookeeper架构/特点

Zookeeper 中的角色主要有以下三类: Zookeeper需要保证高可用性和强一致性为了支持更多的客户端,需要增加更多Server,但是Server增多,意味着投票阶段延迟增大,会影响整个系统的性能。所以在3.3.0中ZK引入的新角色&…

json 反射java 实体_java反射实现javabean转json

BeantoModel->利用cglibBeanMap.create(src);直接将Bean装成Map,然后model._setAttrs(map)即可。ModeltoBean麻烦一点,最简单的方法是用json了。这个bean.dao.put应该是不对的,应该是bean.put吧,还有也不需要转换成map吧&#…

wpf 按钮样式_键盘 | 01.在程序集间引用样式

设置Button和TextBox的特定颜色和字体的样式和默认样式,并在程序集间引用。从零开始用WPF/C#开发一个键盘指示器项目完整开源、免费,不依赖第三方库编译好的先行版程序在微信公众号(香辣恐龙蛋)下载。文章同时发布在微信公众号(香辣恐龙蛋)、B站(香辣恐龙…

怎么去除表中的系统导出的字符_EXCEL非常有用的字符函数LEN、LENB,财务工作者的必备利器...

LEN函数与LENB函数是比较常用的函数,在实际中应用那是相当广的,尤其在财务工作中的使用频率是相当的高。我就一起看看实际工作中哪些地方用到了它。我们先简单说下它的用法,很简单,LEN(text)、LENB(text),两个用法是一…

laravel mysql视图_php-动态更新Laravel视图

我正在通过JS从API加载数据,将数据发送到Laravel控制器并将其保存到数据库中.加载所有Ajax之后,我想在master.blade的子视图/部分中显示数据-可以在页面加载完成后动态呈现视图,-稍后,我想更新数据库行并显示新的视图中的数据动态.//afater Ajax loading - update / display th…

python3打开excel_python3操作Excel (一)

安装:pip install openpyxlexcel表中有图像,需要安装pillow库。pip install Pillow代码:from openpyxl import Workbookwb Workbook()# grab the active worksheetws wb.active# Data can be assigned directly to cellsws[‘A1‘] 42# Rows can also…

java 获得json对象的属性值_JSON 获取属性值的方法

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习…

python常用包数据分析_数据分析领域常用的五个Python包

NumpyNumpy提供了两种基本的对象:ndarray和ufunc。ndarray是存储单一数据类型的多维数组,而ufunc是能够对数组进行处理的函数。Numpy的功能:N维数组,一种快速、高效使用内存的多维数组,他提供矢量化数学运算。可以不需…

python中空字符串的布尔值是什么_Python的布尔值与空值

Googlehack之Github hacksite:aircrk.com smtpsite:aircrk.com smtp mail.comsite:aircrk.com root passwordsite:aircrk.com smtp ...lock#ifndef lock_h #define lock_h #include #include #include "myd ...SQL2012删除作业失败的处理修改msdb数据库中的过程sp_delete_…

java软尾山地车碳_JAVA FURIA 27.5入门软尾山地车评测

铝合金车架、前后100mm避震行程、超短把立、长款燕把、27.5轮径……之前跟大家讲过,在这台车上你能拥有全避震车型所应该具备的所有基础元素。2个月的时间已经过去,这台车到底怎么样呢?我们一起来看一下。优点:质量靠谱&#xff0…

pytorch和python有什么区别_PyTorch到底好用在哪里?

先来回答一下你提的几个问题:Pytorch连最基本的maximum, minimum, tile等等这些numpy和tensorflow中最简单的运算都没有,用view来reshape还会报错contiguous(虽然我知道怎么解决),官方手册也查不到相应说明,这个东西到底好用在哪里…

java arraylist 过滤_关于java:ArrayList过滤器

本问题已经有最佳答案,请猛点这里访问。如何从Java ARAYLIST中筛选出一些东西,如:你好吗?你怎么做乔迈克过滤器是"怎样"的,它可以去除乔和迈克。这可能有助于stackoverflow.com/questions/122105/&helli…

如何下载python安装包的所有依赖_如何将包含所有依赖项的python包安装到Docker镜像中?...

我在Ubuntu 15.10中使用Docker容器为Pyspark jupyter / pyspark-notebook工作.我需要安装具有所有依赖项的folium并在容器中运行Pyspark脚本.我成功安装了Docker,拉出了图像并使用命令运行它docker run -d -p 8888:8888 -p 4040:4040 -v /home/$MYUSER/$MYPROJECT:/home/jovyan…

java 匹配最后一次出现的字符_在Java中查找字符串中字符的最后一次出现

使用该lastIndexOf()方法在Java中查找字符串中字符的最后一次出现。假设以下是我们的字符串。String myStr "Amit Diwan";在上面的字符串中,我们将找到字符i的最后一次出现myStr.lastIndexOf(i);以下是完整的示例。示例public class Demo {public static…

python面向对象编程从零开始_Python面向对象编程从零开始,从没对象到有对象

原标题:Python面向对象编程从零开始,从没对象到有对象欢迎关注天善智能 hellobi.com,我们是专注于商业智能BI,大数据,数据分析领域的垂直社区,学习、问答、求职,一站式搞定!对商业智…

java 模拟路由表_Router的路由表

Router中使用routers字段表示路由表,这是一个数组,每个元组的类型是[desnination,nexthop],其中destination表示目的网段(cidr),nexthop表示下一跳的IP,举例如下:“routes”:[ { “destination”:”10.50.10.0/24” “…

python 知乎 合并 pdf_一键下载:将知乎专栏导出成电子书

原标题:一键下载:将知乎专栏导出成电子书老是有同学问,学了 Python 基础后不知道可以做点什么来提高。今天就再用个小例子,给大家讲讲,通过 Python和爬虫,可以完成怎样的小工具。在知乎上,你一定…