当我们查看JDK API的时候,总会发现一些类说明写着,线程安全或者线程不安全,比如说StringBuilder中,有这么一句,“将StringBuilder 的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用StringBuffer。 ”,那么下面手动创建一个线程不安全的类,然后在多线程中使用这个类,看看有什么效果。
Count.java:
public class Count {
private int num;
public void increment() {
num++;
}
public int get() {
return num;
}
}
在这个类中的increment方法是累加num值,步长为1。
ThreadTest.java:
public class ThreadTest {
public static void main(String[] args) {
Count count = new Count();
Runnable runnable = new Runnable() {
public void run() {
for (int i = 0; i < 10000; i++) {
count.increment();
}
}
};
List<Thread> threads = new ArrayList<>(10);
for (int i = 0; i < 10; i++) {
Thread thread = new Thread(runnable);
threads.add(thread);
thread.start();
}
while (true) {
if (allThreadTerminated(threads)) {// 所有线程运行结束
System.out.println(count.get());
break;
}
}
}
private static boolean allThreadTerminated(List<Thread> threads) {
for (Thread thread : threads) {
if (thread.isAlive()) {
return false;
}
}
return true;
}
}
这里启动了10个线程,每个线程累加1万次,我们期望的最终结果是10万,看一下输出结果:
95388
在我的电脑上运行,大多数情况下都会得到一个小于10万的值,那么想要得到我们期望的结果,就需要保证Count在多线程下使用是安全的,如何保证,请看下文。
本文来自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/7421217,转载请注明。