我正在准备Java SE 7程序员II考试。在其中一个模拟考试中,有一个练习是从代码遭受的线程问题来命名的。代码如下:
public class Test {
public static void main(String[] args) {
final Counter obj1 = new Counter("obj1");
final Counter obj2 = new Counter("obj2");
new Thread(new Runnable() {
@Override
public void run() {
Thread.currentThread().setName("first");
obj1.display(obj2);
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
Thread.currentThread().setName("second");
obj2.display(obj1);
}
}).start();
}
}
class Counter extends Thread {
int i = 10;
String name;
public Counter(String name) {
this.name = name;
}
public synchronized void display(Counter obj) {
try {
Thread.sleep(5);
obj.increment(this);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public synchronized void increment(Counter obj) {
System.out.println(++i);
}
}他们说这是一个活锁。我看不到它。有没有人能详细解释一下。
发布于 2014-07-07 22:53:19
根据维基百科的定义,我不认为这是活锁
活锁类似于死锁,不同之处在于活锁中涉及的进程的状态彼此之间不断变化,没有进展。
尽管它确实符合死锁的定义
在操作系统中,死锁是当一个进程或线程进入等待状态时发生的一种情况,因为所请求的资源正被另一个等待进程持有,而该进程又在等待另一个资源。如果一个进程无法无限期地改变其状态,因为它所请求的资源正被另一个等待的进程使用,那么系统就被称为死锁。
第一个线程拥有obj1的锁,第二个线程拥有obj2的锁,然后它们请求另一个线程的锁和阻塞。
发布于 2014-07-07 23:38:44
下面是每个线程的工作原理:
run方法中,因为Counter.display是它的display方法。increment方法,因为increment方法是在另一个增量上,并要求它递增自己的对象-奇怪,但不会导致死锁。<代码>H215<代码>G216除了不将i设置为易失性(因为它可以以多线程方式访问)的问题之外,这里还有许多与锁相关的问题,但主要问题是:
在stage 1 3.请求锁之前,不会释放步骤中持有的锁对我来说,这是一个潜在的死锁,因为如果两个线程都在另一个命中3之前通过了阶段1,那么两个线程都会锁定。然而,由于这两个线程有可能实际上工作得很好,只要它们从未命中,那么可能会将其解释为活锁,因为两个线程可以愉快地一起运行一段时间,直到它们最终致命的拥抱。
因此,我将这个称为潜在死锁,让学究决定如何命名它。
发布于 2015-02-26 12:19:49
运行上面的程序并获得线程转储
对于第一线程
"first@573" prio=5 tid=0xb nid=NA waiting for monitor entry
java.lang.Thread.State: BLOCKED
blocks second@575
waiting for second@575 to release lock on <0x245> (a dp.Counter)
at dp.Counter.increment(LiveLock.java:44)
at dp.Counter.display(LiveLock.java:37)
- locked <0x246> (a dp.Counter)
at dp.LiveLock.lambda$main$0(LiveLock.java:15)
at dp.LiveLock$$Lambda$1.16460856.run(Unknown Source:-1)
at java.lang.Thread.run(Thread.java:745)对于第二个线程
"second@575" prio=5 tid=0xc nid=NA waiting for monitor entry
java.lang.Thread.State: BLOCKED
blocks first@573
waiting for first@573 to release lock on <0x246> (a dp.Counter)
at dp.Counter.increment(LiveLock.java:44)
at dp.Counter.display(LiveLock.java:37)
- locked <0x245> (a dp.Counter)
at dp.LiveLock.lambda$main$1(LiveLock.java:20)
at dp.LiveLock$$Lambda$2.23661220.run(Unknown Source:-1)
at java.lang.Thread.run(Thread.java:745)看起来像是死锁的情况。
https://stackoverflow.com/questions/24613396
复制相似问题