天天看点

Java多线程之synchronized关键字全面解析1.0

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。

那么我们该如何避免这种后果呢?请看下一章~~