62,612
社区成员
发帖
与我相关
我的任务
分享
/**
* TestThreads.java
*/
public class TestThreads {
public static void main(String[] args) {
ThreadOne t1 = new ThreadOne();
ThreadTwo t2 = new ThreadTwo();
Thread one = new Thread(t1);
Thread two = new Thread(t2);
one.start();
two.start();
}
}
/**
* Accum.java
*/
class Accum {
private static Accum a = new Accum();
private int counter = 0;
private Accum() { }
public static Accum getAccum() {
return a;
}
public void updateCounter(int add) {
counter += add;
}
public int getCount() {
return counter;
}
}
/**
*
* ThreadOne.java
*/
class ThreadOne implements Runnable{
Accum a = Accum.getAccum();
public void run() {
for( int x = 0; x < 98; x++) {
a.updateCounter(1000);
try {
Thread.sleep(50);
} catch(InterruptedException ex) { }
}
System.out.println("one " + a.getCount());
}
}
/**
*
* ThreadTwo.java
*/
class ThreadTwo implements Runnable{
Accum a = Accum.getAccum();
public void run() {
for( int x = 0; x < 99; x++) {
a.updateCounter(1);
try {
Thread.sleep(50);
} catch(InterruptedException ex) { }
}
System.out.println("two " + a.getCount());
}
}
时间片A 时间片B 时间片B 时间片C 时间片D 时间片E
线程A: | 获得counter值:0 | --> | 将值增加1000 = 1000| --> | 将1000写回counter | counter=1000
线程B: | 获得counter值:0 | ----> | 将值增加1 = 1| --------> | 将1写回counter | counter=1
/** * 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();
}
}