【发布时间】:2018-07-21 10:17:21
【问题描述】:
我正在编写线程排序程序并且执行有两个方法“prevMethod”和“anotherMethod”在同一个类和同一个监视器共享对象“lock1”中执行,那么为什么两个线程都在同一个同步块中执行,不它违背了监控对象的目的。
class Ordering extends Thread {
SharedObject obj = null;
boolean flag = false;
private AtomicInteger counter;
Ordering(String name, SharedObject obj, AtomicInteger counter) {
super(name);
this.obj = obj;
this.counter = counter;
}
public void run() {
while (true) {
prevMethod();
System.out.println("New Method Started");
anotherMethod();
}
}
private void prevMethod() {
synchronized (obj) {
System.out.println(Thread.currentThread().getName() + " Section 1");
while (!obj.flag) {
try {
System.out.println(Thread.currentThread().getName() + " "
+ counter.getAndIncrement());
obj.wait();
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
obj.flag = true;
obj.notify();
}
}
private void anotherMethod() {
synchronized (obj) {
System.out.println(Thread.currentThread().getName() + " Section 2");
while (obj.flag) {
System.out.println(Thread.currentThread().getName() + " "
+ counter.getAndIncrement());
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
obj.flag = false;
obj.notify();
}
}
}
public class SequencialPrinting {
public static void main(String... arg) {
AtomicInteger counter = new AtomicInteger(3);
SharedObject lock1 = new SharedObject();
Thread t1 = new Thread(new Ordering("Thread 1", lock1, counter));
Thread t2 = new Thread(new Ordering("Thread 2", lock1, counter));
t1.start();
t2.start();
}
}
输出:
Thread-0 Section 1
Thread-0 3
Thread-1 Section 1
Thread-1 4
【问题讨论】:
-
Object.wait() 的 javadoc 是怎么说的?
-
另外,你的
Ordering extends Thread然后你将new Ordering传递给另一个Thread。不确定您要达到的目标... -
输出没有显示线程同时在块中。
-
如果线程在调用 wait() 时释放锁,那么任何其他线程都可以进入锁定在该锁上的同步块,因为没有其他线程持有它。这就是释放锁的意义所在。如果等待没有释放锁,你怎么能通知线程,因为你需要一个锁来通知?
-
啊,是的。我懂了。 (但在持有锁的意义上,它们并不是“在块中”。但这就是你的意思。)
标签: java multithreading