为什么需要锁,以及上下文切换到底发生了什么。
i++、i–
这里用一个简单的例子距离,i 是静态变量(static)
对于 i++
而言,实际上在 JVM
中会变成
1 | getstatic i // 获取静态变量 i 的值 |
同理,i--
。
所以,这些方法并不是原子性的,当多个线程同时修改同一个变量,就会导致出现错误。
临界区 critical section
多个线程读取共享资源是没有问题的。
一段代码块存在对共享资源的多线程读写操作,称这段代码去为临界区。
竞态条件 Race Condition
多个线程在临界区内执行,由于代码的执行序列不同而导致结果无法预测,称之为发生了竞态条件。
应用互斥
为了避免临界区的竞态条件发生,有以下手段
- 阻塞式的解决方案
synchronized
、Lock
- synchronized
- 非阻塞式的解决方案
- 原子变量