我如何同步这个程序

时间:2017-04-11 01:19:46

标签: java multithreading

我正在尝试编写一个启动1000个线程的程序。每个线程将1添加到最初为0的变量和。通过将引用并行传递给每个线程来执行此操作,并且我被告知使用 Integer 包装器对象执行此操作持有。

代码:

public class synchronizedsum {
    public static void main(String args[]){
        int sum=0;
        ExecutorService executor = Executors.newCachedThreadPool();
        for(int i=0;i<1000;i++){
            executor.execute(new Adder(sum));
        }
        executor.shutdown();
        while(!executor.isTerminated()){

        }
        System.out.println(sum);
}
private static class Adder implements Runnable{
    private int sum;
    Adder(int sum){
        this.sum = sum;
    }

    public synchronized void run(){
        sum+=1;
    }
}
}

我认为我有一些错误,因为似乎没有工作。

编辑: 我一直得到输出为0而不是1000就是问题。

编辑: 我尝试这样做似乎给了我正确的输出,但不确定它是否满足通过引用每个线程传递总和的条件。

CODE:

public class synchronizedsum {

    private static Interger obj = new Interger();
    public static void main(String[] args) {

        ExecutorService executor = Executors.newCachedThreadPool();
        for(int i=0;i<1000;i++){
            executor.execute(new Add1());
        }
        executor.shutdown();
        while(!executor.isTerminated()){

        }
        System.out.println(obj.getSum());
    }
private static class Interger{
    private volatile int sum =0;
    private Lock lock = new ReentrantLock();
    public void add(int amount){
        lock.lock();
        try {
            sum+=amount;
            Thread.sleep(5);
        } catch (InterruptedException ex) {
            Logger.getLogger(Practice.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            lock.unlock();
        }
    }
    public int getSum(){
        return sum;
    }

}
public static class Add1 implements Runnable{

    public  void run(){
        obj.add(1);
    }
}
}

2 个答案:

答案 0 :(得分:0)

是否会传递AtomicInteger而不是整数帮助?您不必处理synchronized方法,因为更新AtomicInteger的值会为您保证。

答案 1 :(得分:0)

上面的代码是不必要的复杂。您可以使用AtomicInteger

通过简单的解决方案实现它

很少有建议:

  1. newCachedThreadPool()更改为newFixedThreadPool(Runtime.getRuntime().availableProcessors());

  2. 删除锁定

  3. ,使用AtomicInteger的incrementAndGet

    您可以参考此帖子中的示例代码并相应地修改您的代码。

    How can I access the property value of a running Thread