package com.asc.mmmu;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
class Cell { // Do not use
private static final Log log=LogFactory.getLog(Cell.class);
private long value;
synchronized long getValue() { return
value; }
synchronized void setValue(long v) {
value = v; }
synchronized void swapValue(Cell other)
{
long t = getValue();
long v = other.getValue();
setValue(v);
other.setValue(t);
}
static class R implements Runnable{
Cell a;
Cell b;
@Override
public void run() {
a=new Cell();
a.setValue(1);
b=new Cell();
b.setValue(2);
for(int i=0;i<100;i++){
try {
log.info("a swap b");
Thread.sleep(10);
} catch (InterruptedException e) {
log.error("sleep erro",e);
}
a.swapValue(b);
try {
log.info("b swap a");
Thread.sleep(10);
} catch (InterruptedException e) {
log.error("sleep erro",e);
}
b.swapValue(a);
}
}
}
public static void deadlock(){
Cell.R r=new Cell.R();
Thread[] a=new Thread[2];
for (int i = 0; i < 2; i++) {
a[i]=new Thread(r);
a[i].start();
}
try {
a[0].join();
} catch (InterruptedException e) {
log.error("sleep error",e);
}
}
public static final void main(String[] args){
log.info("begin");
Cell.deadlock();
log.info("end");
}
}
试验表明: 关键是
1.synchronized void swapValue(Cell other){} 的 synchronized .
2.a.swapValue(b);b.swapValue(a);
这两个条件,同时具备,才会deadlock.
解决:resource ordering
public void swapValue(Cell other) {
if (other == this) // alias check
return;
else if (System.identityHashCode(this) < System.identityHashCode(other))
this.doSwapValue(other);
else
other.doSwapValue(this);
}
protected synchronized void doSwapValue(Cell other) {
// same as original public version:
long t = getValue();
long v = other.getValue();
setValue(v);
other.setValue(t);
}
关键:System.identityHashCode(this) < System.identityHashCode(other)) ,不再deadlock.
另外一个办法:外部lock
class ExternalLock {
public static synchronized void swapCells(Cell cell1, Cell cell2) {
cell1.swapValue(cell2);
}
}
分享到:
相关推荐
《求生之路插件开发与应用:以all4dead为例》 在电子游戏领域,特别是多人在线合作游戏《求生之路》(Left 4 Dead,简称L4D)中,玩家社区的活跃度往往体现在自定义内容的创作上。插件作为游戏的一种扩展方式,允许...
**5、Dead-Lock锁** 死锁是指两个或多个事务互相等待对方释放资源,导致整个系统陷入僵局的情况。InnoDB通过定时检测死锁并选择回滚其中一个事务的方式来解决死锁问题。例如,事务A锁定了记录1,并试图锁定记录2;...
"数码相机DeadPixelTest坏点和噪点测试程序工具中文绿色版"是一款专为检测这些问题设计的实用软件。这款工具可以帮助用户快速有效地检查相机的传感器,确保其在最佳状态工作。 坏点,也称为像素缺陷,是指相机...
**检查CCD坏点——DeadPixelTest** 在数字摄影领域,CCD(Charge-Coupled Device)是早期广泛使用的图像传感器,它负责捕捉并转换光线为电子信号。然而,随着时间的推移,CCD可能会出现一些问题,如坏点、热点或...
【标题】:“[L4D2]all4dead_L4D2_all4dead_band578_”这个标题提到了一款名为《Left 4 Dead 2》(简称L4D2)的游戏模组,模组名为“all4dead”,并且与“band578”有关。这可能是模组的一个特定版本或者更新,而“_...
《Left 4 Dead 2 Authoring Tools》是Valve公司为《Left 4 Dead 2》(求生之路2)这款游戏开发的一款高级插件开发工具套装。它为玩家和游戏开发者提供了一个完整的环境,用于创建自定义游戏内容,如地图、模型、材质...
### Dead Reckoning技术在网络游戏中的应用 #### 一、Dead Reckoning技术概述 Dead Reckoning(DR)技术在网络游戏中扮演着至关重要的角色,尤其是在处理网络延迟方面。网络延迟指的是用户发起请求到远程系统对该...
The third and final group of chapters − 9to14 − tackles the Model Predictive Control approach to dead-time compensation. These chapters range from the fundamentals of GPC and DMC in Chapter 9, ...
标题中的"Dead Zone"通常指的是在通信或网络技术中,一个信号无法到达或者服务质量显著下降的区域。在本文中,我们将深入探讨“Dead Zone”这一概念,特别是在非线性系统模型——Malab模型中的应用。 描述中提到的...
compensation of dead time effect of the inverter dead time effect causes the impact of the control performance of the INVERTER system, and pointed out that the dead time compensation, the key lies in ...
航位推算(Dead Reckoning)依赖于已知的初始位置、速度和航向信息,结合时间和运动学模型,连续不断地估算出当前位置。在海洋、航空和自动驾驶等领域,航位推算常与传感器数据结合,提高定位精度。 在MATLAB中实现...
在IT行业中,"dead"这个标题可能是在指代某个项目、任务或问题的状态,暗示它已经停止运行或者没有进展。然而,由于描述同样为"dead",没有提供具体的信息,我们只能推测这可能与系统崩溃、软件错误或者资源未被正确...
本资源包括: ①一个txt说明文档,包含此坏点查询的每一步操作详细说明。只需四到五就可得出结果。 ②坏点检测程序。已包含所有运行所需的环境,下载双击即可使用。 坏点检测程序最新版2017功能更新内容 ...
### PWM死区(Dead Zone)的作用和意义 #### 引言 PWM(Pulse Width Modulation,脉宽调制)是一种广泛应用于电子工程的技术,它通过调节脉冲宽度来实现模拟信号的数字输出控制。在实际应用中,尤其是在驱动大功率...
标题“dead_secretary”可能指的是一个与IT相关的项目或软件,这个名字可能暗示着这是一个有关管理、组织或数据存储的主题,而“secretary”通常与行政工作、文档处理和信息管理相联系。不过,由于信息有限,无法...
DeadPixelTest DeadPixelTe 亮度超过60流明的点,是噪点。超过250流明的点为坏点
资源分类:Python库 所属语言:Python 资源全名:dead_hosts_launcher-1.4.1-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
`babel-plugin-transform-dead-code-elimination` 是一个非常实用的Babel插件,它专注于帮助开发者消除JavaScript代码中的“死代码”。死代码指的是在程序运行过程中永远不会被执行到的代码片段,可能是由于条件语句...
资源分类:Python库 所属语言:Python 资源全名:dead_simple_framework-0.9.2.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
在电子系统设计中,"Dead Time Timer"是一个关键概念,特别是在多开关系统或者PWM(脉宽调制)应用中。这个概念与AVR(Atmel的微控制器系列)硬件的使用紧密相关。AVR微控制器以其高效能和低功耗特性在嵌入式系统...