Thread专题(3)中,如何实现组合对象间的线程同步?

2026-05-28 02:390阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计2346个文字,预计阅读时间需要10分钟。

Thread专题(3)中,如何实现组合对象间的线程同步?

此文章被作者收录在系列文章《架构师必备》(系列)中。文中首先介绍了程序安全与同步的基础知识,但作者不希望为了获得程序安全而分析每次内存访问,而是希望组合成程序安全。

此文被笔者收录在系列文章 ​​​架构师必备(系列)​​ 中

虽然前面介绍了一些线程安全与同步的基础知识,但我们不希望为了获得线程安全而去分析每次内存访问,而希望组合成更大的组件或程序安全的组件对外提供安全性。

一、设计线程安全的类

设计线程安全类的过程应该包括3个基本要素:1、确定对象状态由哪些变量构成;2、确定限制状态变量的不变约束;3、制定一个管理并发访问对象状态的策略。

这里的关键点就是对象内部数据的同步,同步策略定义了对象如何协调对其状态的访问,并且不会违反它的不变约束和后验条件以及先验条件。它规定了如何把不可变性、线程限制和锁结合起来,从而维护线程的安全性,还指明了哪些锁保护哪些变量。

收集同步需求

维护类的线程安全性意味着确保在并发访问下保护它的不变约束,这需要对其状态进行判断。很多类通过不变约束来判定某一种状态是否合法,比如计数,那么17下面必然是18。但是如果是温度,那么就不必遵循上面的17下面是18这样的规则。这就叫后验条件。

不变约束和方法的后验条件加在状态及状态转换上的约束,引入了额外的同步与封装的需要。如果某些状态是非法的,则必须封装该状态下的状态变量,否则客户代码会将对象置于非法状态。如果一个操作的过程中出现非法置换,则这个操作必须是原子的。另一方面,如果类并未强制任何约束,那么可以开放一些类的封装和序列化的条件以获得更佳的灵活性

不理解对象的不变约束和后验条件,就不能保证线程的安全性。要约束状态变量的有效值或状态置换,就需要原子性与封装性。

阅读全文

本文共计2346个文字,预计阅读时间需要10分钟。

Thread专题(3)中,如何实现组合对象间的线程同步?

此文章被作者收录在系列文章《架构师必备》(系列)中。文中首先介绍了程序安全与同步的基础知识,但作者不希望为了获得程序安全而分析每次内存访问,而是希望组合成程序安全。

此文被笔者收录在系列文章 ​​​架构师必备(系列)​​ 中

虽然前面介绍了一些线程安全与同步的基础知识,但我们不希望为了获得线程安全而去分析每次内存访问,而希望组合成更大的组件或程序安全的组件对外提供安全性。

一、设计线程安全的类

设计线程安全类的过程应该包括3个基本要素:1、确定对象状态由哪些变量构成;2、确定限制状态变量的不变约束;3、制定一个管理并发访问对象状态的策略。

这里的关键点就是对象内部数据的同步,同步策略定义了对象如何协调对其状态的访问,并且不会违反它的不变约束和后验条件以及先验条件。它规定了如何把不可变性、线程限制和锁结合起来,从而维护线程的安全性,还指明了哪些锁保护哪些变量。

收集同步需求

维护类的线程安全性意味着确保在并发访问下保护它的不变约束,这需要对其状态进行判断。很多类通过不变约束来判定某一种状态是否合法,比如计数,那么17下面必然是18。但是如果是温度,那么就不必遵循上面的17下面是18这样的规则。这就叫后验条件。

不变约束和方法的后验条件加在状态及状态转换上的约束,引入了额外的同步与封装的需要。如果某些状态是非法的,则必须封装该状态下的状态变量,否则客户代码会将对象置于非法状态。如果一个操作的过程中出现非法置换,则这个操作必须是原子的。另一方面,如果类并未强制任何约束,那么可以开放一些类的封装和序列化的条件以获得更佳的灵活性

不理解对象的不变约束和后验条件,就不能保证线程的安全性。要约束状态变量的有效值或状态置换,就需要原子性与封装性。

阅读全文