java Synchronized方法无法按预期工作



我有一个synchronized方法,它的类对象由两个线程共享,但当我运行此代码时,同步似乎不起作用,我是不是遗漏了一点?非常感谢您的帮助。

public class Main {
static class Bar {
private int count = 0;
public synchronized void increment(int value) {
count += value;
}
}
static class CustomThread extends Thread {
Bar b;
int threadNumber;
Thread1(Bar b, int threadNumber){
this.b = b;
this.threadNumber = threadNumber;
}
public void run() {
for (int i=0; i <=25; i++) {
b.increment(1);
System.out.println("THREAD " +  threadNumber + " " + b.count);
}
}
} 
public static void main(String[] args) {
Bar bar = new Bar();
CustomThread t1 =new CustomThread(bar, 1);
CustomThread t2 =new CustomThread(bar, 2);
t1.start();
t2.start();
}

我期望输出类似以下内容(THREAD 1 (1 to 25(,然后是THREAD 2 (1 to 25)(,但没有得到

输出为:

THREAD 2 2
THREAD 1 1
THREAD 2 3
THREAD 1 4
THREAD 2 5
THREAD 1 6
THREAD 2 7
THREAD 2 9
THREAD 1 8
THREAD 1 11
THREAD 2 10
THREAD 2 13
THREAD 1 12
THREAD 1 15
THREAD 2 14
THREAD 2 17
THREAD 1 16
THREAD 1 19
THREAD 2 18
THREAD 2 21
THREAD 1 20
...

如果您首先想要THREAD 1,然后想要THREAD2,那么就执行

t1.start();
t1.join();
t2.start();

但是,在使用Threads时,为什么要这样呢?

无论synchronized如何,两个线程都同时运行。

共享Bar上的increment是同步的,因此增量是原子的:1、2、3、4。。。并且不像未同步的1,2,2,3,4,4。

打印发生在同步部件之外,可能会出现故障。但特别是b.count可能是过时的,由于缺少volatile而没有在其他线程中更新。

为了有一个更确定,清晰的视图所有做:

public synchronized int increment(int value) {
count += value;
return count;
}
int c = b.increment(1);
System.out.println("THREAD " +  threadNumber + " " + c);

请注意,System.out.println是一个非常慢的资源,并且使它们可以交替执行。

相关内容

  • 没有找到相关文章

最新更新