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();
}
}
能输出,但是有异常存在,不明白为什么.
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();
}
}
能输出,但是有异常存在,不明白为什么.
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");
}
}