0
伯爵“这个” elasped时间下同步的增量方法是:20000经过时间:5001两个线程调用比预期
我得到这样的结果,当我键入下面的代码,我有一个具有计数的类变量在“this”的同步块中增加,为什么当我在main中创建一个新的Exercise对象,然后2个线程使用2 anon runnable的调用ex.increment时,它只需要5秒?不应该总共为10秒,因为一个线程获得一个锁并且它在另一个应该等待的时候工作吗?我得到同步的想法,但我只是困惑,为什么如果我要使练习实现可运行并将其传递给Thread()构造函数,它将需要10秒,但不是这样,请解释谢谢。
public class Exercise {
private int count = 0;
public int getCount() {
return count;
}
public void increment() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (this) {
for (int i = 0; i < 10000; i++) {
count++;
}
}
}
}
public class App {
public static void main(String[] args) {
Exercise ex = new Exercise();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
ex.increment();
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
ex.increment();
}
});
long start = System.currentTimeMillis();
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
long end = System.currentTimeMillis();
System.out.println("Count is: " + ex.getCount() + " Time elapsed: " + (end - start));
}
}
_When_是获得的锁吗?睡觉之前或之后?换句话说,睡眠呼叫是并行执行还是一个接一个地执行? –
等待,所以你说的是方法同时睡5秒,而同步的块实际上是在5秒之外连续执行的。 – Calyxander
他们有什么理由等待彼此? –