学完的知识如果不使用或者不常常回顾,那么还不是自己的知识。
基础:Java,JavaSE基础没,JavaEE,前台开发(html、css、javascript、query、extjs)
框架:Struts、hibernate、spring、springMVC、SpringBoot、SpringCloud、Mybatis、Mybatis-plus
数据层:linux、oracle
当我们查看JDK API的时候,总会发现一些类说明写着,线程安全或者线程不安全。
比如说StringBuilder中,有这么一句,"将StringBuilder
的实例用于多个线程是不安全的。
如果需要这样的同步,则建议使用StringBuffer
。"
创建一个线程不安全的类,然后在多线程中使用这个类,看看有什么效果
public class Count {
private int num;
public void increment() {
num++;
}
public int get() {
return num;
}
}
import java.util.ArrayList;
import java.util.List;
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万,看一下输出结果:
94785
在我的电脑上运行,大多数情况下都会得到一个小于10万的值,那么想要得到我们期望的结果.
就需要保证Count在多线程下使用是安全的。