public interface CounterI {
void addOne();
int getCount();
}
public class Counter implements CounterI {
private static int count = 0;
@Override
public void addOne() {
count++;
}
@Override
public int getCount() {
return count;
}
}
import java.util.concurrent.atomic.AtomicInteger;
public class CounterAtomic implements CounterI{
private static AtomicInteger count = new AtomicInteger();
public void addOne() {
count.incrementAndGet();
}
public int getCount() {
return count.get();
}
}
public class CounterThreadLocal implements CounterI{
private static ThreadLocal<Integer> count = new ThreadLocal<Integer>() {
@Override
protected Integer initialValue() {
return 0;
}
};
public void addOne() {
count.set(count.get() + 1);
}
public int getCount() {
return count.get();
}
}
public class ClientThread extends Thread {
private CounterI c;
public ClientThread(CounterI c1) {
this.c = c1;
}
public void run() {
c.addOne();
System.out.println(c.getCount()+" "+c.getClass().getName());
}
}
public class MainThread {
public static void main(String[] args) {
System.out.println("不做任何处理的多线程是乱序的");
CounterI c = new Counter();
for (int i = 0; i < 10; i++) {
ClientThread t = new ClientThread(c);
t.start();
}
System.out.println("Atomic控制的多线程是有序的");
c = new CounterAtomic();
for (int i = 0; i < 10; i++) {
ClientThread t = new ClientThread(c);
t.start();
}
System.out.println("ThreadLocal控制的多线程是互不影响的");
c = new CounterThreadLocal();
for (int i = 0; i < 10; i++) {
ClientThread t = new ClientThread(c);
t.start();
}
}
}