【发布时间】:2018-08-05 21:02:37
【问题描述】:
所以想象有一个类 A 像这样实现 Runnable:
class A implements Runnable {
C c;
Thread t;
public A(C c){
this.c = c;
t = new Thread(this);
}
public void start(){
t.start();
}
public void run(){
for (int i = 0; i < 5; i++){
c.doIt();
}
}
}
C 类只包含一个同步方法,按字符打印当前线程详细信息,如下所示:
class C {
synchronized void doIt(){
String s = Thread.currentThread().toString();
for (int i = 0; i < s.length(); i++) {
System.out.print(s.charAt(i));
}
System.out.println();
}
}
如果我在我的 main 方法中创建 2 个线程,同时使用 C 类的共享对象 c,我不应该收到随机的线程执行顺序,因为只有 doIt 方法是同步的吗?我想象的方式是,在 t1 完成 doIt() 的迭代后,t2 线程将能够接收控制。似乎锁是由 t1 获取的,直到线程的整个循环完成它的工作。所以我的问题是 - 同步是否意味着线程也必须在另一个线程启动之前完成(不仅仅是 doIt() 的同步)?
【问题讨论】:
-
你上过Oracle Tutorial: Concurrency的课程了吗?
-
是的,你是对的。这两个线程可以混合在一起。但是你的循环只循环了 5 次。太少了,任何线程都不能被另一个线程启动。我将循环更改为 500,得到了您的期望。
标签: java multithreading synchronization execution