- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
是否可以通过多个线程共享一个对象来模拟Java死锁场景?
比如我有一个类
public class MyClass {
public synchronized void syncInstanceMethod1(){
/// Anything here to simulate a dead lock
}
public synchronized void syncInstanceMethod2(){
/// Anything here to simulate a dead lock
}
public static synchronized void syncStaticMethod1(){
/// Anything here to simulate a dead lock
}
public static synchronized void syncStaticMethod2(){
/// Anything here to simulate a dead lock
}
public void instanceMethod1(){
/// Anything here to simulate a dead lock
}
public void instanceMethod2(){
/// Anything here to simulate a dead lock
}
public static void main(String[] args) {
MyClass shared = new MyClass(); // Allowed to create only one instance
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
// Do whatever here to simulate dead lock like calling various methods on the shared object in any order
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
// Do whatever here to simulate dead lock like calling various methods on the shared object in any order
}
});
// Allowed to create more threads like above. t3 , t4 etc...
t1.start();
t2.start();
}
}
也许这是不可能的。由于可能发生死锁的常见情况是一个代码块,它在其中获取一个对象的锁并且在不释放它的情况下尝试获取另一个对象的锁。
我们可以通过调用静态同步方法从其中一个同步实例方法模拟这种情况,即尝试在锁定“this”的同时锁定“class”对象。但是要发生死锁,我们需要在其他地方以相反的顺序出现类似的情况。
此外,由于静态方法不能访问'this',它不能锁定'this',并且两个同步实例方法不能同时运行,这些事情让人相信我们不能在这里模拟死锁。我说得对吗?
最佳答案
尽管您只被要求创建一个实例,线程仍然有两个锁需要争用。实例方法需要线程获取 MyClass
对象实例上的锁,即 shared
或 this
,具体取决于您如何看待它。
另一方面,静态方法需要线程获取 MyClass.class
class 对象实例上的锁;你从 this.getClass()
得到的。
因此,如果线程 A 已经在执行一个同步实例方法(在 this
上有一个锁)并试图进入其中一个同步静态方法,而另一个线程 B 也已经在执行一个静态方法(在 MyClass.class
上有一个锁)现在试图进入同步实例方法在同一个 MyClass
对象上,死锁将发生。
下面是一些模拟这种情况的代码。
public class SingleObjectDeadlock {
public synchronized void syncInstanceMethod1() {
System.out.println("In syncInstanceMethod1()");
syncStaticMethod2();
}
public synchronized void syncInstanceMethod2() {
System.out.println("In syncInstanceMethod2()");
}
public static synchronized void syncStaticMethod1(SingleObjectDeadlock shared) {
System.out.println("In syncStaticMethod1()");
shared.syncInstanceMethod2();
}
public static synchronized void syncStaticMethod2() {
System.out.println("In syncStaticMethod2()");
}
public static void main(String[] args) {
SingleObjectDeadlock shared = new SingleObjectDeadlock();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
shared.syncInstanceMethod1();
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
SingleObjectDeadlock.syncStaticMethod1(shared);
}
});
t1.start();
t2.start();
System.out.println("DEADLOCK!");
}
}
运行时你会发现发生死锁并且程序永远不会打印
In syncStaticMethod2()
In syncInstanceMethod2()
关于java - 模拟Java线程死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28598115/
我有类似下面的代码: ... id: myComponent signal updateState() property variant modelList: [] Repeater { mo
我正在处理一些我无法展示的私有(private)代码,但我已经制作了一些示例代码来描述我的问题: 主.c: #include #include #include #include typede
这个问题在这里已经有了答案: 关闭10 年前。 Possible Duplicate: what are the differences in die() and exit() in PHP? 我想
在编写 Perl 模块时,在模块内部使用 croak/die 是一个好习惯吗? 毕竟,如果调用者不使用 eval block ,模块可能会使调用它的程序崩溃。 在这些情况下,最佳做法是什么? 最佳答案
我有一些搜索线程正在存储结果。我知道当线程启动时,JVM native 代码会代理在操作系统上创建新 native 线程的请求。这需要 JVM 之外的一些内存。当线程终止并且我保留对它的引用并将其用作
我刚刚花了很多时间调试一个我追溯到 wantarray() 的问题。 .我已将其提炼为这个测试用例。 (忽略 $! 在这种情况下不会有任何有用信息的事实)。我想知道为什么wantarray在第二个示例
我看到一些代码是这样做的: if(something){ echo 'exit from program'; die; } ...more code 和其他只使用 die 的人: if
我正在尝试将此表格用于: 如果任何 $_POST 变量等于任何其他 $_POST 变量抛出错误。 如果只有几个,那不是问题,但我有大约 20 个左右所以如果我想这样做,我将不得不像这样 但这
每次我运行: hadoop dfsadmin -report 我得到以下输出: Configured Capacity: 0 (0 KB) Present Capacity: 0 (0 KB) DFS
我是一名优秀的程序员,十分优秀!