达内烟台中心 > 达内新闻
Java 程序死锁问题原理
- 发布:互联网
- 来源:互联网
- 时间:2017-05-02 16:29
一、有些事情难以回头
开篇我先表明自己的立场:同时使用 .Net 和 JAVA,但更加偏爱.Net.原因很简单:
.Net语言更具开放性,从开源协议和规范可以看出;
语言更具优势严谨;
开发工具 VS 更具生产力;
然而
Java,C# 的职位比率在4:1,虽然这不是什么问题,因为求职竞争的比例更大(JAVA中更多的刚培训出来的),但话说回来,对于C#求职而言,会面临更加狭窄的企业选择空间.烟台IT培训
Java同等职位,国内的待遇比.Net稍高.这里为 .Net 说声不平,.Net开源程度更好,架构体系更成熟逻辑更严谨,开发效率更高,服务器同样可以使用Linux.
这些不对等的原因
1. 历史原因
JAVA 早.Net 5年出生,一开始就对各大平台(主要就Linux)提供技术支持,微软前两任CEO都固步自封以为WINDOWS可以始终独步天下,压根就瞧不起Linux,因此.Net原本可以飞的实力(本来就可以跨平台、更好的语言特性)被微软给封杀了,尤其那个叫做鲍尔默夜郎自大.
因为JAVA在其出生的年代凭借其优势可谓天子骄子,因此吸引很多IT人员加入其阵营之中,这些人占领了各行各业的企业之中,慢慢这些JAVA从业者成为技术领导,在后来的十几年中,微软依旧固步自封,故此JAVA占领了绝大多数企业技术决策层.
2.Android的成功
虽然JAVA越来越老,微软转向开源界、.Net开源、但使用JAVA作为应用语言的Android取的了智能设备领域的巨大成功,这无非给年老的JAVA打了一针强心剂,虽然C#可以同时支持Android/IOS开发,但因为上面的历史原因(JAVA占领了绝大多数企业技术决策层),依旧缓慢前行.
3.微软在手机系统中的失利
不仅巨坑了诺基亚,而且手机系统这么多年一直在改. 而且不提供后向兼容.后果当然也算得上.Net阵营的失利.
已经出版的《大话Java性能优化》请大家多多支持,《深入学习JVM&G1 GC》、《动手学习Apache ZooKeeper》预计2016年下半年出版.
Java 语言通过 synchronized 关键字来保证原子性,这是因为每一个 Object 都有一个隐含的锁,这个也称作监视器对象.在进入 synchronized 之前自动获取此内部锁,而一旦离开此方式,无论是完成或者中断都会自动释放锁.显然这是一个独占锁,每个锁请求之间是互斥的.相对于众多高级锁 (Lock/ReadWriteLock 等),synchronized 的代价都比后者要高.但是 synchronzied 的语法比较简单,而且也比较容易使用和理解.Lock 一旦调用了 lock() 方法获取到锁而未正确释放的话很有可能造成死锁,所以 Lock 的释放操作总是跟在 finally 代码块里面,这在代码结构上也是一次调整和冗余.Lock 的实现已经将硬件资源用到了极致,所以未来可优化的空间不大,除非硬件有了更高的性能,但是 synchronized 只是规范的一种实现,这在不同的平台不同的硬件还有很高的提升空间,未来 Java 锁上的优化也会主要在这上面.既然 synchronzied 都不可能避免死锁产生,那么死锁情况会是经常容易出现的错误,下面具体描述死锁发生的原因及解决方法.
死锁描述
死锁是操作系统层面的一个错误,是进程死锁的简称,最早在 1965 年由 Dijkstra 在研究银行家算法时提出的,它是计算机操作系统乃至整个并发程序设计领域最难处理的问题之一.
事实上,计算机世界有很多事情需要多线程方式去解决,因为这样才能最大程度上利用资源,才能体现出计算的高效.但是,实际上来说,计算机系统中有很多一次只能由一个进程使用的资源的情况,例如打印机,同时只能有一个进程控制它.在多通道程序设计环境中,若干进程往往要共享这类资源,而且一个进程所需要的资源还很有可能不止一个.因此,就会出现若干进程竞争有限资源,又推进顺序不当,从而构成无限期循环等待的局面.我们称这种状态为死锁.简单一点描述,死锁是指多个进程循环等待它方占有的资源而无限期地僵持下去的局面.很显然,如果没有外力的作用,那么死锁涉及到的各个进程都将永远处于封锁状态.
系统发生死锁现象不仅浪费大量的系统资源,甚至导致整个系统崩溃,带来灾难性后果.所以,对于死锁问题在理论上和技术上都必须予以高度重视.
银行家算法
一个银行家如何将一定数目的资金安全地借给若干个客户,使这些客户既能借到钱完成要干的事,同时银行家又能收回全部资金而不至于破产.银行家就像一个操作系统,客户就像运行的进程,银行家的资金就是系统的资源.
银行家算法需要确保以下四点:
当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客;
顾客可以分期贷款, 但贷款的总数不能超过最大需求量;
当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款;
当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金.
更多访烟台IT培训相关资讯,请扫描下方二维码

最新开班时间
- 北京
- 上海
- 广州
- 深圳
- 南京
- 成都
- 武汉
- 西安
- 青岛
- 天津
- 杭州
- 重庆
- 哈尔滨
- 济南
- 沈阳
- 合肥
- 郑州
- 长春
- 苏州
- 长沙
- 昆明
- 太原
- 无锡
- 石家庄
- 南宁
- 佛山
- 珠海
- 宁波
- 保定
- 呼和浩特
- 洛阳
- 烟台
- 运城
- 潍坊
Java 程序死锁问题原理
- 发布:互联网
- 来源:互联网
- 时间:2017-05-02 16:29
一、有些事情难以回头
开篇我先表明自己的立场:同时使用 .Net 和 JAVA,但更加偏爱.Net.原因很简单:
.Net语言更具开放性,从开源协议和规范可以看出;
语言更具优势严谨;
开发工具 VS 更具生产力;
然而
Java,C# 的职位比率在4:1,虽然这不是什么问题,因为求职竞争的比例更大(JAVA中更多的刚培训出来的),但话说回来,对于C#求职而言,会面临更加狭窄的企业选择空间.烟台IT培训
Java同等职位,国内的待遇比.Net稍高.这里为 .Net 说声不平,.Net开源程度更好,架构体系更成熟逻辑更严谨,开发效率更高,服务器同样可以使用Linux.
这些不对等的原因
1. 历史原因
JAVA 早.Net 5年出生,一开始就对各大平台(主要就Linux)提供技术支持,微软前两任CEO都固步自封以为WINDOWS可以始终独步天下,压根就瞧不起Linux,因此.Net原本可以飞的实力(本来就可以跨平台、更好的语言特性)被微软给封杀了,尤其那个叫做鲍尔默夜郎自大.
因为JAVA在其出生的年代凭借其优势可谓天子骄子,因此吸引很多IT人员加入其阵营之中,这些人占领了各行各业的企业之中,慢慢这些JAVA从业者成为技术领导,在后来的十几年中,微软依旧固步自封,故此JAVA占领了绝大多数企业技术决策层.
2.Android的成功
虽然JAVA越来越老,微软转向开源界、.Net开源、但使用JAVA作为应用语言的Android取的了智能设备领域的巨大成功,这无非给年老的JAVA打了一针强心剂,虽然C#可以同时支持Android/IOS开发,但因为上面的历史原因(JAVA占领了绝大多数企业技术决策层),依旧缓慢前行.
3.微软在手机系统中的失利
不仅巨坑了诺基亚,而且手机系统这么多年一直在改. 而且不提供后向兼容.后果当然也算得上.Net阵营的失利.
已经出版的《大话Java性能优化》请大家多多支持,《深入学习JVM&G1 GC》、《动手学习Apache ZooKeeper》预计2016年下半年出版.
Java 语言通过 synchronized 关键字来保证原子性,这是因为每一个 Object 都有一个隐含的锁,这个也称作监视器对象.在进入 synchronized 之前自动获取此内部锁,而一旦离开此方式,无论是完成或者中断都会自动释放锁.显然这是一个独占锁,每个锁请求之间是互斥的.相对于众多高级锁 (Lock/ReadWriteLock 等),synchronized 的代价都比后者要高.但是 synchronzied 的语法比较简单,而且也比较容易使用和理解.Lock 一旦调用了 lock() 方法获取到锁而未正确释放的话很有可能造成死锁,所以 Lock 的释放操作总是跟在 finally 代码块里面,这在代码结构上也是一次调整和冗余.Lock 的实现已经将硬件资源用到了极致,所以未来可优化的空间不大,除非硬件有了更高的性能,但是 synchronized 只是规范的一种实现,这在不同的平台不同的硬件还有很高的提升空间,未来 Java 锁上的优化也会主要在这上面.既然 synchronzied 都不可能避免死锁产生,那么死锁情况会是经常容易出现的错误,下面具体描述死锁发生的原因及解决方法.
死锁描述
死锁是操作系统层面的一个错误,是进程死锁的简称,最早在 1965 年由 Dijkstra 在研究银行家算法时提出的,它是计算机操作系统乃至整个并发程序设计领域最难处理的问题之一.
事实上,计算机世界有很多事情需要多线程方式去解决,因为这样才能最大程度上利用资源,才能体现出计算的高效.但是,实际上来说,计算机系统中有很多一次只能由一个进程使用的资源的情况,例如打印机,同时只能有一个进程控制它.在多通道程序设计环境中,若干进程往往要共享这类资源,而且一个进程所需要的资源还很有可能不止一个.因此,就会出现若干进程竞争有限资源,又推进顺序不当,从而构成无限期循环等待的局面.我们称这种状态为死锁.简单一点描述,死锁是指多个进程循环等待它方占有的资源而无限期地僵持下去的局面.很显然,如果没有外力的作用,那么死锁涉及到的各个进程都将永远处于封锁状态.
系统发生死锁现象不仅浪费大量的系统资源,甚至导致整个系统崩溃,带来灾难性后果.所以,对于死锁问题在理论上和技术上都必须予以高度重视.
银行家算法
一个银行家如何将一定数目的资金安全地借给若干个客户,使这些客户既能借到钱完成要干的事,同时银行家又能收回全部资金而不至于破产.银行家就像一个操作系统,客户就像运行的进程,银行家的资金就是系统的资源.
银行家算法需要确保以下四点:
当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客;
顾客可以分期贷款, 但贷款的总数不能超过最大需求量;
当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款;
当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金.
更多访烟台IT培训相关资讯,请扫描下方二维码

最新开班时间
- 北京
- 上海
- 广州
- 深圳
- 南京
- 成都
- 武汉
- 西安
- 青岛
- 天津
- 杭州
- 重庆
- 厦门
- 哈尔滨
- 济南
- 福州
- 沈阳
- 合肥
- 郑州
- 长春
- 苏州
- 大连
- 长沙
- 昆明
- 温州
- 太原
- 南昌
- 无锡
- 石家庄
- 南宁
- 中山
- 兰州
- 佛山
- 珠海
- 宁波
- 贵阳
- 保定
- 呼和浩特
- 东莞
- 洛阳
- 潍坊
- 烟台
- 运城