这是Oracle关于Lock对象的java教程中的例子。有人请确认我是否正确解释了代码。为什么线程在释放锁之后仍然运行?
我会考虑只有第一个线程,因为其他工作方式相同。
首先,它获取alphonse的锁,并访问方法impendingBow。该方法现在尝试将两个实例的两个锁分配给该线程。如果线程无法获取这两个锁,它将释放它获取的锁。这是当我抚摸。如果线程释放锁,另一个可以访问这两个实例,并且第一个线程在释放锁之后应该停止执行。但事实并非如此。它仍然返回布尔值并继续在bow方法中运行else语句。为什么可能发生?我认为就像同步代码一样,线程应该停止执行,直到它再次获得锁定。
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.Random;
public class Safelock {
static class Friend {
private final String name;
private final Lock lock = new ReentrantLock();
public Friend(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public boolean impendingBow(Friend bower) {
Boolean myLock = false;
Boolean yourLock = false;
try {
myLock = lock.tryLock();
yourLock = bower.lock.tryLock();
} finally {
if (! (myLock && yourLock)) {
if (myLock) {
lock.unlock();
}
if (yourLock) {
bower.lock.unlock();
}
}
}
return myLock && yourLock;
}
public void bow(Friend bower) {
if (impendingBow(bower)) {
try {
System.out.format("%s: %s has"
+ " bowed to me!%n",
this.name, bower.getName());
bower.bowBack(this);
} finally {
lock.unlock();
bower.lock.unlock();
}
} else {
System.out.format("%s: %s started"
+ " to bow to me, but saw that"
+ " I was already bowing to"
+ " him.%n",
this.name, bower.getName());
}
}
public void bowBack(Friend bower) {
System.out.format("%s: %s has" +
" bowed back to me!%n",
this.name, bower.getName());
}
}
static class BowLoop implements Runnable {
private Friend bower;
private Friend bowee;
public BowLoop(Friend bower, Friend bowee) {
this.bower = bower;
this.bowee = bowee;
}
public void run() {
Random random = new Random();
for (int n = 0; n <5;n++) {
try {
Thread.sleep(Math.round(Math.random()*1000));
} catch (InterruptedException e) {}
bowee.bow(bower);
}
}
}
public static void main(String[] args) {
final Friend alphonse =
new Friend("Alphonse");
final Friend gaston =
new Friend("Gaston");
new Thread(new BowLoop(alphonse, gaston)).start();
new Thread(new BowLoop(gaston, alphonse)).start();
}
}
是什么让你认为一个线程应该停止执行_after_释放一个'Lock'对象? – 2014-12-04 16:37:15
我将锁对象与同步代码关联起来,它只允许线程在获取锁的情况下运行代码,并且如果线程没有锁,则会阻塞线程。 – PMH 2014-12-04 16:41:30
它如何获得一个锁,如果它没有运行? – 2014-12-04 16:42:46