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();
}
}
}
本文通过三种不同方式实现了一个简单的计数器:普通共享变量、使用AtomicInteger进行原子操作及利用ThreadLocal保证线程隔离。并通过多线程环境下的运行结果对比了它们的行为差异。
1208

被折叠的 条评论
为什么被折叠?



