线性化和可串行化之间有什么区别?

时间:2010-11-14 20:41:12

标签: java concurrency

线性化和可串行化(在Java的上下文中)有什么区别?能否请您通过示例解释这些差异或提供一个好的参考?

5 个答案:

答案 0 :(得分:54)

两者之间的区别在于可序列化全局属性;整个经营/交易历史的财产。 可线性化本地属性;单个操作/事务的属性。另一个区别是线性化包括实时的概念,可序列化不包括:操作的线性化点必须位于其调用和响应时间之间。 (参见Tim Harris: Transactional Memory,2ed 。有些例子,请参阅Herlihy的幻灯片来自多处理器编程的艺术,关于可线性化的部分,available here和证据。

两个属性都针对相同的目标:顺序一致性。来自Herlihy的论文:

  

对数据库和分布式系统的大量工作使用可序列化作为并发计算的基本正确性条件。在此模型中,事务是一个控制线程,它将有限的基本操作序列应用于与其他事务共享的一组对象。如果历史是等同于事务似乎顺序执行的历史,即没有交错,则历史是可序列化的。可以以明显的方式在非重叠的事务对上定义(部分)优先顺序。如果顺序历史记录中的交易顺序与其优先顺序兼容,则历史记录是严格可序列化的......

     

...线性化可以被视为严格可串行化的一种特殊情况,其中事务被限制为由应用于单个对象的单个操作组成。然而,这种单一操作限制具有深远的实际和正式结果,使线性化计算与其可序列化对应物具有不同的风格。一个直接的实际结果是,适用于可串行化的并发控制机制通常不适合线性化,因为它们会引入不必要的开销并对并发性施加不必要的限制。

参考文献:

更多详情:

如果您真的关心这一点,请阅读介绍定义的论文。对于线性化,那是Linearizability: A Correctness Condition for Concurrent Objects, Herlihy and Wing。它很密集,但值得关注。请注意,在软件事务存储器社区中,线性化是否是正确的目标/属性是一个悬而未决的问题。

序列化是关于一系列操作的结果/“系统”可以表达为所有的特定排序(“好像是按特定顺序执行......”)操作。线性化是系统中单个操作子集的属性......如果操作/操作集在其他操作中看起来好像它们在(逻辑)时间内相对于其他操作发生时,则可操作/操作集是可线性化的。这里的规范论文是Papadimitriou, The Serializability of Concurrent Database Updates

当您考虑“线性化”时,请考虑“原子操作”。一组(一组)操作在它们(看起来)相对于系统的其他部分原子地发生时是可线性化的。一个常见的表述是“提供每个操作在其调用和响应之间即时生效的错觉”。 线性化的表述归因于Herlihy,它强调这是一个局部属性,而不是其他类型的顺序一致性属性,如“可序列化”,它们是全局的。

答案 1 :(得分:10)

Peter Bailis在这里有一个很好的解释:

"用简单的英语,在线性化下,写入应该是即时的。不精确的是,一旦写入完成,所有后来的读取(其中“稍后”由挂钟开始时间定义)应该返回该写入的值或稍后写入的值。一旦读取返回特定值,所有后来的读取都应该返回该值或稍后写入的值。"

" 可序列化是对一个或多个对象的事务或一组或多组操作的保证。它保证在多个项目上执行一组事务(通常包含读取和写入操作)等同于事务的某些串行执行(总排序)。"

答案 2 :(得分:3)

请参阅@ andersoj的答案,以清楚地描述可串行化和线性化之间的区别。

这只与Java并发编程间接相关。通常,并发Java程序不需要具有可序列化或可线性化的历史记录。在这种情况下,可序列化通常足以使程序(Java或其他)获得“正确性”,尽管特定问题可能需要更强的线性化特性。但无论哪种方式,问题都决定了正确性要求,而不是Java。

答案 3 :(得分:2)

检查维基百科的解释:

http://en.wikipedia.org/wiki/Linearizability#Linearizability_versus_serializability

它也可能有点令人困惑,因为我们还使用术语serialize来指代将类转换为数据流以进行存储或网络传输。

答案 4 :(得分:0)

理解这一点的一种好方法是从数据库的角度来看这个问题。 (对不起,我知道您要求使用Java上下文)

假设您是一个数据库。您接受同时同时在同一对象上运行的多个事务,但是您只有一个磁盘臂

当您同时收到多个事务时,您将必须以某种方式对事务中的这些操作进行重新排序,以便您的磁盘工作人员可以一对一地处理它们。

可序列化

您可以重新安排这些交易,使它们看起来像顺序发生(一个接一个)。 您可以想象,如果您接受任意交易(例如最近10年的一次不良交易),并非总是可能的。 因此,自然地,您实施了一些限制或冲突预防机制,然后可以说“我是可序列化的!:)”。

可线性化

您不仅需要执行serialization需要执行的操作。您还可以很好地了解这些交易。并在不破坏交易的语义顺序的情况下,极力尝试以顺序方式重新安排这些交易。您可能已经注意到,semantic order是关键。 基本上,为了声明您是linearizable,您将必须为每个交易假定/找到一个linearization point,然后根据linearization point对其进行排序。

因此,通用的RDMS数据库说Hey I'm linearizable!并不常见。 但是,如果您是键值数据库,这并不少见。

例如作为KV数据库,您可以说“我是linearizable!”如果可以确保read将始终获得最新的写入。 (假设发送read操作响应的时刻为linearization point) 这听起来很琐碎,但是如果您是分布式KV数据库,这将是一个重大挑战。 另外请注意,serializability不需要您提供相同的保证。