Java在多线程方面有一个synchronized关键字。这个关键字可以称为Java高并发之魂。为什么要引入synchronized关键字呢??我们可以先看一个案例:
首先我们写一个L类负责打印消息
public class L {
public static void p(String str) {
System.out.println(str);
}
}
然后我们来写一个测试类:
public class Test implements Runnable {
static Test instance = new Test();
static int i = 0;
public static void main(String[] args) {
Thread thread1 = new Thread(instance);
Thread thread2 = new Thread(instance);
thread1.start();
thread2.start();
while (thread1.isAlive() || thread2.isAlive()) {
}
L.p("" + i);
}
@Override
public void run() {
for (int j = 0; j < 10000; j++)
i++;
}
}
这个代码很简单 相信大家都看的明白 就是执行 i++ ,但是按照常理来说我们希望i最后的值是 2W 可是运行会发现 i 的值总是小于2W。 为什么呢?
这是因为 一个简单的 i++其实分为三步:
1.读取i 2. i的值增加1 3.将改变后的 i 的值存到内存中。
所以造成结果小于2W的原因就是 thread1中执行完第二步, 还没来得及进行到第三步, thread2中已经开始执行第一步了。
就比如说 thread1中i的值变成了9 然后它准备把写入到内存中 但是还没来得及写入, thread2就开始读取了,那么thread2 读取的值就是8,然后thread2 执行完第二步 ,也变成了9 ,相当于就浪费了一次增加数值的机会。因此得到的结果就会小于2W。
那么我们该如何避免这种后果呢?请看下一章~~