正如文件所说
睡觉时,线程不会释放它所持有的锁
但是,我的代码段演示它确实释放锁定
public class SynchronizationTest {
public static void main(String[] args) {
Common c = new Common();
new PersonONE(c);
new PersonTWO(c);
}
}
class Common {
private String message = "This is shared message";
public String getMessage() {
return message;
}
}
class PersonONE extends Thread {
private Common c;
public PersonONE(Common c) {
this.c = c;
start();
}
@Override
public void run() {
synchronized (c.getClass()) {
for (int i = 0; i < 5; i++) {
System.out.println("PersonONE: " + c.getMessage());
try {
Thread.currentThread().sleep(100);
} catch (InterruptedException e) {}
}
}
}
}
class PersonTWO extends Thread {
private Common c;
public PersonTWO(Common c) {
this.c = c;
start();
}
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("PersonTWO: "+c.getMessage());
try {
Thread.sleep(100);
} catch (InterruptedException e){}
}
}
}
输出
PersonONE:这是共享消息
PersonTWO:这是共享消息
PersonONE:这是共享消息
PersonTWO:这是共享消息
PersonONE:这是共享消息
PersonTWO:这是共享消息
PersonONE:这是共享消息
PersonTWO:这是共享消息
PersonONE:这是共享消息
PersonTWO:这是共享信息
所以,问题是:我错在哪里?
答案 0 :(得分:6)
PersonTWO并没有尝试获取锁定。
请参阅下面的示例,该示例确实证明睡眠不会释放锁定。
private static class Locker implements Runnable {
private final Object lock;
private final String message;
private Locker(final Object lock, final String message) {
this.lock = lock;
this.message = message;
}
@Override
public void run() {
try {
synchronized (lock) {
for (int i = 0; i < 10; i++) {
System.out.println(message);
Thread.sleep(1000);
}
}
}
catch (InterruptedException ex) {
}
}
}
public static void main(String[] args) {
final int numThreads = 2;
final Object lock = new Object();
for (int i=0;i<numThreads;i++) {
new Thread(new Locker(lock, "Hello - " + i)).start();
}
}