【发布时间】:2017-07-21 11:45:04
【问题描述】:
我试图掌握 Java 中同步方法的概念,但遇到了似乎令人困惑的行为,至少对我来说是这样; 在代码中:
public class parallelUpdate
{
public static void main(String[] args)
{
Ob ob = new Ob();
new Thread(ob).start();
new Thread(ob).start();
}
}
class Ob implements Runnable
{
static int cnt = 0;
private synchronized void inc()
{
cnt++;
}
@Override
public void run()
{
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread());
inc();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
...递增由两个踏板并行执行:
Thread[Thread-0,5,main]
Thread[Thread-1,5,main]
Thread[Thread-0,5,main]
Thread[Thread-1,5,main]
Thread[Thread-1,5,main]
Thread[Thread-0,5,main]
Thread[Thread-0,5,main]
Thread[Thread-1,5,main]
我预计对 inc() 方法使用 synchronized 会产生顺序递增,例如:
Thread[Thread-0,5,main]
Thread[Thread-0,5,main]
Thread[Thread-0,5,main]
Thread[Thread-0,5,main]
Thread[Thread-0,5,main]
Thread[Thread-1,5,main]
Thread[Thread-1,5,main]
Thread[Thread-1,5,main]
Thread[Thread-1,5,main]
Thread[Thread-1,5,main]
我的代码有什么问题?
【问题讨论】:
-
尝试使用
run()方法synchronized而不是inc()方法。 -
使用
atomic Integer类方法处理线程 -
“我预计对 inc() 方法使用同步会产生顺序递增”为什么您期望它?您只同步了
inc方法。这意味着没有两个线程可以并行执行它,但这并不意味着这将是某种特定的执行顺序。 -
@Konstantin 请找到我的答案
-
@Konstantin 请投票,谢谢。 :)
标签: java concurrency synchronization