《Java线程与并发编程实践》—— 2.3 谨防活跃性问题

本节书摘来异步社区《Java线程与并发编程实践》一书中的第2章,第2.3节,作者: 【美】Jeff Friesen,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.3 谨防活跃性问题

活跃性这个词代表着某件正确的事情最终会发生。活跃性失败发生在应用程序触及一种无法继续执行的状态。在单线程的应用程序中,无限循环就是一个例子。多线程应用程序面临着诸如死锁、活锁和饿死的额外挑战。

死锁:线程1等待线程2互斥持有的资源,而线程2也在等待线程1互斥持有的资源。两条线程都无法继续执行。
活锁:线程x持续重试一个总是失败的操作,以致于无法继续执行。
饿死:线程x一直被(调度器)延迟访问其赖以执行的资源。或许是调度器先于低优先级的线程执行高优先级的线程,而总是有一个高优先级的线程可以执行。饿死通常也称为无限延迟。
死锁会发生在synchronized关键字带来的过多同步上。如果不小心,你可能就会遭遇锁同时被多条线程竞争的情形;即线程自身缺失继续执行的锁,却持有其他线程需要的锁,同时由于其他线程持有临界区的锁,导致没有一条线程能够通过临界区,进而释放自己所持有的锁。清单2-1就是描述该场景的一个典型例子。

清单2-1 一个死锁的问题

public class DeadlockDemo
{private final Object lock1 = new Object();private final Object lock2 = new Object();public void instanceMethod1(){synchronized(lock1){synchronized(lock2){System.out.println("first thread in instanceMethod1");// critical section guarded first by// lock1 and then by lock2} }}public void instanceMethod2(){synchronized(lock2){synchronized(lock1){System.out.println("second thread in instanceMethod2");// critical section guarded first by// lock2 and then by lock1}}}public static void main(String[] args){final DeadlockDemo dld = new DeadlockDemo();Runnable r1 = new Runnable(){@Overridepublic void run(){while(true){dld.instanceMethod1();try{Thread.sleep(50);}catch (InterruptedException ie){}} }};Thread thdA = new Thread(r1);Runnable r2 = new Runnable(){@Overridepublic void run(){while(true){dld.instanceMethod2();try{Thread.sleep(50);}catch (InterruptedException ie){}}}};Thread thdB = new Thread(r2);thdA.start();thdB.start();}
}```
清单2-1中线程A和线程B在不同的时间分别调用了instanceMethod1()和instanceMethod2()方法。参考下面的执行序列:(1)线程A调用instanceMethod1(),获取到lock1引用对象的锁,然后进入它外部的临界区(但是还没有获取lock2引用对象的锁)。(2)线程B调用instanceMethod2(),获取到lock2引用对象的锁,然后进入它外部的临界区(但是还没有获取lock1引用对象的锁)。(3)线程A尝试去获取和lock2相关联的锁。JVM强制线程在内部临界区之外等待,由于线程B持有那个锁。(4)线程B尝试去获取和lock1相关联的锁。JVM强制线程在内部临界区之外等待,由于线程A持有那个锁。(5)由于其他线程持有了必要的锁,没有一条线程能继续执行。遭遇死锁,程序(至少在这两条线程的上下文中)就冻结住了。照下面那样编译清单2-1:

javac DeadlockDemo.java
运行程序:

java DeadlockDemo`
你应该能在标准输出流中观测到交替打印的first thread in instance Method1和second thread in instanceMethod2信息,直到程序因死锁而冻结。

尽管前面的例子很清晰地识别了死锁的状态,但侦测死锁还是不容易。举个例子,你的代码可能在多个类中(在多个源文件里)包含如下的环形关系:

类A的同步方法调用了类B的同步方法。
类B的同步方法调用了类C的同步方法。
类C的同步方法调用了类A的同步方法。
如果线程A调用了类A的同步方法,线程B调用了类C的同步方法,因为线程A还在那个方法当中,当线程B尝试调用类A的同步方法时,会被阻塞住。线程A会继续执行直至其调用类C的同步方法,然后阻塞住。死锁发生了。

注意:
  >Java语言和JVM都没有提供一种方式来避免死锁,所以这一任务就落到你的身上。避免死锁最简单的方式,就是阻止同步方法或者同步块调用其他的同步方法和同步块。尽管这个建议能避免死锁发生,但还是不现实,因为,在你的某一个同步方法和同步块中,很可能需要调用Java API中的同步方法,而且这个建议有点因噎废食,因为被调用的同步方法和同步块很可能不会调用其他的同步方法和同步块,从而不会导致死锁发生。

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

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

相关文章

.Net/C#分库分表高性能O(1)瀑布流分页

框架介绍依照惯例首先介绍本期主角:ShardingCore 一款ef-core下高性能、轻量级针对分表分库读写分离的解决方案,具有零依赖、零学习成本、零业务代码入侵dotnet下唯一一款全自动分表,多字段分表框架,拥有高性能,零依赖、零学习成本、零业务代码入侵,并且支持读写分离…

centos静默安装oracle关于报错UnsatisfiedLinkError exception loading native library:njni10

静默安装oracle时,日志文件中打印出如下语句 提示Oracle NetConfiguration Assistant failed,原因是找不到libaio.so.1 这是缺少依赖 执行指令 yum -y install libaio* libaio-devel* 删除home文件夹,再次执行 ./runInstaller -silent…

Ant—使用Ant构建一个简单的Java工程(两)

博客《Ant—使用Ant构建一个简单的Java项目(一)》演示了使用Ant工具构建简单的Java项目,接着这个样例来进一步学习Ant:上面样例须要运行多条ant命令才干运行Test类中的main函数,能不能简化须要运行命令呢?答…

C++之函数指针实现函数回调

1、问题 C++很多地方需要函数指针回调,但是我理解还是不够深刻,今天再写了测试例子,方便后面更深入理解和记忆。 2、代码实现 A.h 文件实现 // // A.h // TestC++ // // Created by 1111 on 17/8/17. // Copyright © 2017年 sangfor. All rights reserved. //#…

JMS的样例

1、JMS是一个由AS提供的Message服务。它能接受消息产生者(Message Provider)所发出的消息,并把消息转发给消息消费者(Message Consumer)。2、JMS提供2种类型的消息服务:(1)Queue,即点对点,每一个消息仅仅转发给一个消息消费者使用…

《面向对象的思考过程(原书第4版)》一1.11 组合

本节书摘来自华章出版社《面向对象的思考过程(原书第4版)》一书中的第1章,第1.11节,[美] 马特魏斯费尔德(Matt Weisfeld) 著黄博文 译更多章节内容可以访问云栖社区“华章计算机”…

Hadoop 新增删除节点

1 新增Data节点 1.1 修改/etc/hosts,增加datanode的ip 1.2 在新增加的节点启动服务 hadoop-daemon.sh start datanode yarn-daemon.sh start nodemanager 1.3 均衡block start-balancer.sh 1)如果不balance,那么cluster会把新的数据都存放在…

Java Thread Status(转)

public static enum Thread.State extends Enum<Thread.State>线程状态。线程可以处于下列状态之一&#xff1a; 1.NEW 至今尚未启动的线程的状态。 2.RUNNABLE 可运行线程的线程状态。 处于可运行状态的某一线程正在 Java 虚拟机中运行&#xff0c;但它可能正在…

秀!微软《550页图解.Net+WPF完整版》.pdf 附下载!

赶紧看看微软公司基于最新的.netwpf编写文档。对于零基础可以作为.net的快速入门教材&#xff0c;对于高级程序员而言&#xff0c;这也是你的充电之路&#xff01;NO.1资料介绍该手册,全面的介绍.net的新特性&#xff0c;看完这个资料&#xff0c;你能够对.net/c#WPF的新功能&a…

Android之编译jni出错解决办法

1、问题 1&#xff09;、我编写的类一开始都能编译&#xff0c;后来编译不过 2&#xff09;、undefined reference to Qt::value 2、解决办法 1 )、我在写Android.mk的时候这样注释了下面的代码 LOCAL_SRC_FILES : \A.cpp \B.cpp \# C.cpp \D.cpp \这样导致找不到D…

《移动App测试的22条军规》—第1章1.2节移动App的生命周期

本节书摘来自异步社区《移动App测试的22条军规》一书中的第1章&#xff0c;第1.2节移动App的生命周期&#xff0c;作者黄勇&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.2 移动App的生命周期移动App测试的22条军规&#xff08;1&#xff09;对于还处于…

C语言之常见错误解决办法

1、问题 1)、忘记写const char* p string.c_str()char* p string.data(); 自己傻逼了&#xff0c;编译不过&#xff0c;应该这样写&#xff0c;不要忘记加上const const char* p string.c_str();const char* p string.data(); 2&#xff09;、const char*p 转 char* p co…

电子商务应用课程知识整理 第一章-电子商务概述与类型

一、电子商务定义 电子商务&#xff08;Electronic Commerce&#xff0c;简称EC&#xff09;&#xff0c;是指在全球各地广泛的商业贸易活动中&#xff0c;在因特网开放的网络环境下&#xff0c;基于客户端&#xff08;浏览器、移动端&#xff09;/服务器&#xff0c;买卖双方…

nodejs中文件,目录的操作(1)

首先&#xff0c;我们对fs文件系统分为两类操作&#xff0c;第一类是xxx方法&#xff0c;第二类是xxxSync方法。所有的fs操作几乎都是这两类&#xff0c;第一类是异步回调&#xff0c;第二类是同步等待。 A.对于文件的读写操作 a.完整性读写 1.fs.readFile(filename,[options],…

如何制作自己的静态库

如何制作自己的静态库 将一些不想暴露给使用方的实现代码打包成.a库&#xff08;比如&#xff1a;百度地图sdk,写sdk的时候&#xff0c;需要使用到&#xff09; 需要创建一个静态库的工程&#xff0c;来实现代码逻辑&#xff0c;并完成对代码的打包&#xff08;.a库&#xff09…

Android之jni编译出现error: jump to label ‘XXXX’ [-fpermissive]解决办法

1、问题 Android jni里面编写C代码的时候&#xff0c;我就写了个goto语句&#xff0c;特么也提示下面的错误 error: jump to label ‘XXXX’ [-fpermissive] 这不是日了狗吗&#xff1f;用个goto也出错。 2、原因 我在使用goto的后面语句,有一些初始化变量&#xff0c;如果跳…

《Java和Android开发学习指南(第2版)》—— 1.5 本章小结

本节书摘来异步社区《Java和Android开发学习指南&#xff08;第2版&#xff09;》一书中的第1章&#xff0c;第1.5节&#xff0c;作者&#xff1a;【加】Budi Kurniawan&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.5 本章小结 本章介绍了如何下载和安…

电子商务应用课程知识整理 第二章-电子商务相关知识与技术

一、万维网 万维网&#xff08;亦作“网络”、www、Web或World Wide Web&#xff09;&#xff0c;是一个资源空间。在这个空间中包含一些有用的事务&#xff0c;有一个”统一资源标识符“&#xff08;URL&#xff09;表示。这些资源通过超文本传输协议&#xff08;HTTP&#x…

Spark 性能调优-内存设置-GC设置

http://mt.sohu.com/20150604/n414449770.shtml http://my.oschina.net/mkh/blog/330386 http://itindex.net/detail/51632-spark-%E7%BB%8F%E9%AA%8C http://itindex.net/detail/51631-spark-%E7%BB%8F%E9%AA%8C转载于:https://www.cnblogs.com/liuchangchun/p/4718313.html

Avalonia跨平台入门第十三篇之Expander控件

在前面分享的几篇中咱已经玩耍了Popup、ListBox多选、Grid动态分、RadioButton模板、控件的拖放效果、控件的置顶和置底、控件的锁定、自定义Window样式、动画效果;今天趁着空闲时间接着去摸索基于Expander控件实现的效果,最终实现的效果如下图:来看看具体的布局:Expander控件样…