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

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

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

死锁

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

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

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

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

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

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

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

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

(3) 资源分配不当等。

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

1.锁顺序死锁:

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

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

2.动态的所顺序死锁:

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

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

3.协作对象间的死锁:

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

4.资源死锁:

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

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

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

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

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

饥饿

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

弱响应性

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

活锁

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

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

java社区活跃度_Java并发编程-活跃度问题相关推荐

  1. Java获取用户活跃度_Java并发编程(四)活跃度

    4. 活跃度 一个并发应用及时执行的能力称作活跃度.本节介绍最常见的活跃度问题,死锁,然后继续简单介绍两种其他的活跃度问题,饥饿和活锁. 4.1 死锁 死锁介绍了两个或者多个线程永远阻塞.彼此等待的情 ...

  2. java投票锁_Java并发编程锁之独占公平锁与非公平锁比较

    Java并发编程锁之独占公平锁与非公平锁比较 公平锁和非公平锁理解: 在上一篇文章中,我们知道了非公平锁.其实Java中还存在着公平锁呢.公平二字怎么理解呢?和我们现实理解是一样的.大家去排队本着先来 ...

  3. java lock 对象_Java并发编程锁系列之ReentrantLock对象总结

    Java并发编程锁系列之ReentrantLock对象总结 在Java并发编程中,根据不同维度来区分锁的话,锁可以分为十五种.ReentranckLock就是其中的多个分类. 本文主要内容:重入锁理解 ...

  4. java计算时间差_JAVA并发编程三大Bug源头(可见性、原子性、有序性),彻底弄懂...

    原创声明:本文转载自公众号[胖滚猪学编程]​ 某日,胖滚猪写的代码导致了一个生产bug,奋战到凌晨三点依旧没有解决问题.胖滚熊一看,只用了一个volatile就解决了.并告知胖滚猪,这是并发编程导致的 ...

  5. java 延迟初始化_Java并发编程——延迟初始化占位类模式

    --仅作笔记使用,内容多摘自<java并发编程实战> 在并发编程中,如果状态变量仅在单个线程中初始化和使用,自然是线程安全的,但一旦涉及到线程间的数据交互,如何声明一个用于多线程的单例状态 ...

  6. java 线程工厂_Java并发编程:Java的四种线程池的使用,以及自定义线程工厂

    引言 通过前面的文章,我们学习了Executor框架中的核心类ThreadPoolExecutor ,对于线程池的核心调度机制有了一定的了解,并且成功使用ThreadPoolExecutor 创建了线 ...

  7. java线程池_Java 并发编程 线程池源码实战

    作者 | 马启航 杏仁后端工程师.「我头发还多,你们呢?」 一.概述 笔者在网上看了好多的关于线程池原理.源码分析相关的文章,但是说实话,没有一篇让我觉得读完之后豁然开朗,完完全全的明白线程池,要么写 ...

  8. java executor 异步_Java并发编程11-异步执行框架Executor

    1 Executor框架的简介 1.5后引入的Executor框架的最大优点是把任务的提交和执行解耦.要执行任务的人只需把Task描述清楚,然后提交即可.这个Task是怎么被执行的,被谁执行的,什么时 ...

  9. java volatile 原子性_Java并发编程之验证volatile不能保证原子性

    Java并发编程之验证volatile不能保证原子性 通过系列文章的学习,凯哥已经介绍了volatile的三大特性.1:保证可见性 2:不保证原子性 3:保证顺序.那么怎么来验证可见性呢?本文凯哥(凯 ...

最新文章

  1. 微信搜索谁把你删除了
  2. 真实感水面绘制-资料收集
  3. Java入门算法(暴力篇)丨蓄力计划
  4. vnc 红帽linux安装教程,Linux(redhat\centos)下安装xrdp
  5. Android TensorFlow Lite 深度学习识别手写数字mnist demo
  6. “如果产品经理躺平接受需求,那程序员免不了想打一架”
  7. python和nodejs数据传递_python中的*和**参数传递机制
  8. Java高级工程师技能要求参考
  9. 汇编语言程序设计实验(六)——子程序设计
  10. 常见的日期计算问题(模板)
  11. 简单好用的苹果手机软件数据备份软件
  12. CSS 样式定义方式
  13. python 声音指纹识别,Python-samp中的Dejavu音频指纹识别
  14. 2021年边缘计算融资汇总
  15. 开源许可违反:案例说明(Apache License 2.0)
  16. java电商商品搜索_Java生鲜电商平台-搜索模块的设计与架构
  17. 柠檬浏览器 for linux,柠檬浏览器app官网下载_柠檬浏览器最新官网下载_18183软件下载...
  18. 电子商务网站建设策划书范例
  19. pySpark创建DataFrame的方式
  20. win10设置虚拟内存_电脑配置强,虚拟内存没有用?教你这样设置,瞬间提升流畅度...

热门文章

  1. (含Python源码)Python实现K阶多项式的5种回归算法(regression)
  2. CSAPP-计算机漫游
  3. 统计学第二章--感知机
  4. 《爬虫写得好,铁窗关到老》教你把握爬虫的法律边界!㊫
  5. mbp网速很慢_苹果笔记本上网很慢怎么回事?macbook无线上网慢的解决方法
  6. C++学习之路 | PTA乙级—— 1066 图像过滤 (15 分)(精简)
  7. wdnas群晖nas_西数WD NAS红盘 WD140EFFX 14TB HDD和 SA500 1TB SSD开箱拆解评测
  8. [运维]---linux机器一般监控用到的概念记录
  9. 地图点儿莱唔点儿康的新功能 – 路况 和 短信
  10. c# 获取路径的盘符_c#获取驱动器盘符