Java 同步问题
Java Synchronization Trouble
我是 java 的新手,正在尝试与示例程序同步以使用多线程将数字加到 100。以下是我能够想出的代码。当我测试代码时,它有时会给出正确的值 4590,但有时不会给出正确的值。谁能指出我做错了什么
class Counter{
Integer counter = 0;
public void increment(int i){
synchronized (counter){
counter += i;
}
}
}
class ObjectTest implements Runnable{
int i;
Counter blah;
public ObjectTest(Counter counter,int i){
blah =counter;
this.i = i;
}
@Override
public void run() {
blah.increment(i);
}
}
public class SyncTest {
public static void main(String args[]) throws InterruptedException {
ThreadPoolExecutor executor = new ThreadPoolExecutor(4,10,60, TimeUnit.SECONDS,new SynchronousQueue<Runnable>(), new ThreadPoolExecutor.CallerRunsPolicy());
Counter counter = new Counter();
for (int index = 0; index < 100; index++) {
ObjectTest objectTest = new ObjectTest(counter,index);
executor.execute(objectTest);
}
executor.shutdown();
while (!executor.isTerminated()){
Thread.sleep(1000L);
}
System.out.println(counter.counter);
}
}
您无法在 counter
上同步,因为它是 Integer
,它是不可变的。因此 counter += i
创建一个新的 Integer
对象,它与同步的对象不同。
你可以做到 int counter
并有一个单独的 Object lock = new Object();
,在 lock
上同步。
我是 java 的新手,正在尝试与示例程序同步以使用多线程将数字加到 100。以下是我能够想出的代码。当我测试代码时,它有时会给出正确的值 4590,但有时不会给出正确的值。谁能指出我做错了什么
class Counter{
Integer counter = 0;
public void increment(int i){
synchronized (counter){
counter += i;
}
}
}
class ObjectTest implements Runnable{
int i;
Counter blah;
public ObjectTest(Counter counter,int i){
blah =counter;
this.i = i;
}
@Override
public void run() {
blah.increment(i);
}
}
public class SyncTest {
public static void main(String args[]) throws InterruptedException {
ThreadPoolExecutor executor = new ThreadPoolExecutor(4,10,60, TimeUnit.SECONDS,new SynchronousQueue<Runnable>(), new ThreadPoolExecutor.CallerRunsPolicy());
Counter counter = new Counter();
for (int index = 0; index < 100; index++) {
ObjectTest objectTest = new ObjectTest(counter,index);
executor.execute(objectTest);
}
executor.shutdown();
while (!executor.isTerminated()){
Thread.sleep(1000L);
}
System.out.println(counter.counter);
}
}
您无法在 counter
上同步,因为它是 Integer
,它是不可变的。因此 counter += i
创建一个新的 Integer
对象,它与同步的对象不同。
你可以做到 int counter
并有一个单独的 Object lock = new Object();
,在 lock
上同步。