counter += a; 实际上有三个操作:1:获得 counter 的当前值
2:将这个值加上 a 的值求和
3:将计算和写回 counter下面这个是模拟了一个两个线程在不同时间片中的操作:Java code
         时间片A     时间片B     时间片B        时间片C     时间片D       时间片E线程A:   | 获得counter值:0 | --> | 将值增加1000 = 1000| --> | 将1000写回counter |   counter=1000
线程B:               | 获得counter值:0 | ----> | 将值增加1 = 1| --------> | 将1写回counter |   counter=1要修改的话,可以把 public void updateCounter(int add) 改为:public synchronized void updateCounter(int add)或者使用原子变量 AtomicInteger 来避免加锁:Java code
/** * Accum.java */
class Accum {    private static Accum a = new Accum();    private AtomicInteger counter = new AtomicInteger(0);    private Accum() {
    }    public static Accum getAccum() {
        return a;
    }    public void updateCounter(int add) {
        counter.addAndGet(add);
    }    public int getCount() {
        return counter.get();
    }
}
能输出,但是有异常存在,不明白为什么.

解决方案 »

  1.   

    怪不得 我说怎么没见arraylist呢
      

  2.   

    import java.util.*;
    public class Test {
        public static void main(String []args) {
            ArrayList arrlist = new ArrayList();        String str1 = "Think before you act.\n";
            String str2 = "full of courtesy,full of craft.\n";
            String str3 = "Best is cheapest.\n";
            String str4 = "Look before you leap.\n";
            String str5 = "take time when time comes.\n";
            arrlist.add(str1);
            arrlist.add(str2);
            arrlist.add(str3);
            arrlist.add(str4);
            arrlist.add(str5);
            System.out.println("输出集合内容");
            for(int i=0;i<arrlist.size();i++)
                System.out.print(arrlist.get(i)+"\n");
        }
    }