并发编程中的进度条件与 Java 内存模型解析
1. 并发系统中的进度条件
在并发系统中,线性一致性是一种重要的正确性条件,尤其适用于对并发和实时响应要求较高的系统。不过,非阻塞特性并不完全排除在特定情况下的阻塞。例如,当一个线程尝试从空队列中出队时,它可能会阻塞,直到有其他线程入队元素。这种情况可以通过将出队方法的规范设置为部分规范来处理,即当应用于空队列时,该方法的效果未定义。
线性一致性的非阻塞特性保证了任何挂起的调用都有正确的响应,但没有说明如何计算这些响应。以基于锁的队列为例,若队列初始为空,线程 A 在入队元素 x 的过程中暂停,线程 B 随后调用出队方法。虽然非阻塞特性保证 B 的调用有响应(可能抛出异常或返回 x),但在这个实现中,由于 A 持有锁,B 无法获取锁,会一直被延迟。这种实现被称为阻塞实现,因为一个线程的意外延迟可能会阻止其他线程前进。
常见的进度条件有以下几种:
- 无等待(Wait-Free) :一个方法是无等待的,意味着它保证每个调用都能在有限的步骤内完成执行。如果方法调用的步骤数有上限,则称为有界无等待。例如,Bakery 算法的入口部分就是有界无等待的,其界限为线程的数量。若无等待方法的性能不依赖于活动线程的数量,则称为与线程数量无关的无等待。一个对象的所有方法都是无等待的,那么该对象就是无等待的;在面向对象语言中,一个类的所有对象实例都是无等待的,那么该类就是无等待的。无等待是一种非阻塞的进度条件,一个线程的意外延迟不会必然阻止其他线程前进。
- 无锁(Lock-Free) :一个方法是无锁的,意味着它保证无限次地有某个方法调用能在有限步骤内完成
超级会员免费看
订阅专栏 解锁全文
1059

被折叠的 条评论
为什么被折叠?



