这是我的代码:
private int count = 0;
public synchronized void increment() {
count++;
}
public void doWork() throws InterruptedException {
Thread t1 = new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 5; i++) {
increment();
System.out.println(count+" "+Thread.currentThread().getName());
}}});
Thread t2 = new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 5; i++) {
increment();
System.out.println(count+" "+Thread.currentThread().getName());
}}});
t1.start();
t2.start();
}
这是我的输出:
2 Thread-1
2 Thread-0
3 Thread-1
5 Thread-1
6 Thread-1
4 Thread-0
8 Thread-0
9 Thread-0
7 Thread-1
10 Thread-0
我的理解是increment
是synchronized
。所以,它应该首先递增
一个数字,然后释放锁
,然后将锁
交给线程t1
或 t2
。所以,它应该一次递增
一个数字,对吗?
但为什么我的代码一次递增
两个或三个数字?我做错了什么吗(我是新手)?
最佳答案
虽然 count++;
确实是同步的 System.out.println(count+""+Thread.currentThread().getName());
不是,但是它访问到 count
变量。
即使您同步访问,也无济于事,因为下一种情况仍然可能发生:
- 线程 1 增量
- 线程 2 增量
- 线程 1 打印值
2
- 线程 2 打印值
2
要解决此问题,您需要在同一同步部分中递增和打印。例如,您可以将 System.out.println(count+""+Thread.currentThread().getName());
放入 increment
方法中。
关于java - 为什么 synchronized 不能正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39748960/