赞
踩
目录
三、synchronized 关键字-监视器锁monitor lock
简单的理解:如果多线程环境下代码运行的结果是符合我们预期的,即在单线程环境应该的结果,则说这个程序是线程安全的。
观察一下代码:使用两个线程,每个线程都对这个 Counter进行5w次自增,预计是结果为10w。
- /**
- * Created with IntelliJ IDEA.
- * Description:
- * User: 86136
- * Date: 2023-01-12
- * Time: 20:50
- */
- class Counter {
- public int count = 0;
-
- public void increase() {
- count++;
- }
- }
- public class Demo13 {
- static Counter counter = new Counter();
- public static void main(String[] args) throws InterruptedException {
- //使用两个线程,每个线程都对这个 Counter进行5w次自增
- //预计是结果为10w
-
- Thread t1 = new Thread(() -> {
- for (int i = 0; i < 5_0000; i++) {
- counter.increase();
- }
- });
- Thread t2 = new Thread(() -> {
- for (int i = 0; i < 5_0000; i++) {
- counter.increase();
- }
- });
- t1.start();
- t2.start();
- t1.join();
- t2.join();
- System.out.println(counter.count);
- }
- }
运行结果:
上面我们使用了多线程运行了一个程序,想让这个变量从0自增到10w次,但是最终实际结果比我们预期的结果要小,这是线程调度顺序的随机性导致的,造成了线程间自增的指令集交叉,导致本来需要自增两次但值只自增了一次的情况。所以得到的结果偏小。
2.1 从底层剖析count++的操作
count++ 操作,在底层其实是被分为三条指令在CPU上进行执行的
这里简单的描述几种情况,初始条件:初始值为1,对其进行两次自增。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。