【发布时间】:2018-10-06 15:55:04
【问题描述】:
我正在尝试设置同步方法和非同步方法之间的区别。我尝试了以下代码
class Counter {
private int counter = 10;
public int getCounter() {
return counter;
}
public synchronized void doIncrementAndDecrement() {
counter++;
keepBusy(500);
counter--;
}
public void keepBusy(int howLong) { // (D)
long curr = System.currentTimeMillis();
while (System.currentTimeMillis() < curr + howLong)
;
}
}
class MyCounterThread extends Thread {
Counter c;
public MyCounterThread(Counter c, String name) {
// TODO Auto-generated constructor stub
super(name);
this.c = c;
start();
}
@Override
public void run() {
for (;;) {
c.doIncrementAndDecrement();
sleepForSometime();
System.out.println(c.getCounter());
}
}
public void sleepForSometime() { // (D)
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class UnSynchronizedExapmle {
public static void main(String[] args) throws InterruptedException {
Counter c = new Counter();
MyCounterThread t1 = new MyCounterThread(c, "A");
MyCounterThread t2 = new MyCounterThread(c, "B");
MyCounterThread t3 = new MyCounterThread(c, "C");
}
}
所以上面我有 doIncrementAndDecrement() 同步方法..
所以我希望计数器的值每次都应该是 10。但这不会发生我的输出就像
10
10
11
10
10
10
10
11
10
10
11
10
11
11
10
10
11
10
11
10
10
10
11
10
10
11
10
所以请帮助我为什么会发生这种情况。或者任何解释同步和异步方法之间区别的博客/文章
【问题讨论】:
-
同步方法是在当前线程中运行的方法。 Java 只支持同步方法。异步方法是在另一个线程或进程中执行的方法,即异步。 Java 不直接支持这一点,但您可以使用库来模拟。
标签: java multithreading