0%

java | 上下文切换

为什么需要锁,以及上下文切换到底发生了什么。

i++、i–

这里用一个简单的例子距离,i 是静态变量(static)

对于 i++ 而言,实际上在 JVM 中会变成

1
2
3
4
getstatic i // 获取静态变量 i 的值
iconst_1 // 准备常量 1
iadd // 自增
putstatic 1 // 将修改后的值存入变量 i

同理,i--

所以,这些方法并不是原子性的,当多个线程同时修改同一个变量,就会导致出现错误。

临界区 critical section

多个线程读取共享资源是没有问题的。

一段代码块存在对共享资源的多线程读写操作,称这段代码去为临界区。

竞态条件 Race Condition

多个线程在临界区内执行,由于代码的执行序列不同而导致结果无法预测,称之为发生了竞态条件。

应用互斥

为了避免临界区的竞态条件发生,有以下手段

  • 阻塞式的解决方案
  • 非阻塞式的解决方案
    • 原子变量
请我喝杯咖啡吧~