我有一个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
是一个非常慢的资源,并且使它们可以交替执行。