您的位置:首页 > 编程语言 > Java开发

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

2019-03-18 15:34 501 查看

Java在多线程方面有一个synchronized关键字。这个关键字可以称为Java高并发之魂。为什么要引入synchronized关键字呢??我们可以先看一个案例:

首先我们写一个L类负责打印消息

[code]public class L {
public static void p(String str) {
System.out.println(str);
}
}

然后我们来写一个测试类:

[code]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。

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: