并发编程初探-对象的组合

对象的组合

  一、设计线程安全的类

   1.在设计线程安全类的过程中,需要包括以下三个基本要素:

     1)找出构成对象状态的所有变量

     2)找出约束状态变量的不变性条件

     3)建立对象状态的并发访问管理策略

   2.收集同步需求

     要确保类的线程安全性,就需要确保它的不变性条件不会再并发访问的情况下被破坏,这就需要对其状态进行推断。

     对象与变量都有一个状态空间,即所有可能的取值,状态空间越小,就越容易判断线程的状态。

     如果不了解对象的不变性条件和后验条件,那么久不能确保线程安全性。要满足在状态量的有效值或状态转换上的各种条件,就需要借助于原子性与封装性。

   3.依赖状态的操作

     如果在某个操作中包含基于状态的先验条件,那么这个操作就称为依赖状态的操作。

  二、实例封闭

   1.封装简化了线程安全类的实现过程,它提供了一种实例封闭机制,通常也简称为“封闭”。

   2.将数据封装在对象内部,可以将数据的访问限制在对象的方法上,从而更容易确保线程在访问数据是总能持有正确的锁。

   3.封闭机制更易于构造线程安全类,因为当封闭类的状态变化时,在分析类的线程安全性时就无须检查整个程序。

   4.Java监视器模式

    从线程封闭原则及其逻辑推论可以得出Java监视器模式。遵循Java监视器模式的对象会把对象的所有可变状态都封装起来,并且由对象自己的内置锁来保护。

  三、线程安全性的委托

     如果一个状态变量时线程安全的,并且没有任何不变性条件来约束它的值,在变量的操作上也不存在任何允许的状态转换,那么久可以安全的发布这个变量。

时间: 2024-10-26 11:25:34

并发编程初探-对象的组合的相关文章

并发编程初探-对象的共享

对象的共享 一.可见性 在没有同步的情况下,编译器以及运行时等收可能对操作的执行顺序进行一些意想不到的调整,在缺乏足够同步的多线程程序中,要想对内存操作的执行顺序进行判断,几乎无法得到正确的结论. 1.缺乏同步的程序中可能出产生错误结果的一种情况:失效数据 2.非原子操作 当线程在没有同的情况下读取变量时,可能会得到一个失效值,但至少这个值是由某个线程设置的值,而不是一个随机值.这种安全性保证也被称为最低安全性. 最低安全性适用于绝大多数变量,但是存在一个例外:非volatile类中的64位数值

并发编程初探-线程安全性

在Java并发编程中,对于线程安全是非常重要的,也是必须要考虑的一个问题.可以这么说,只要涉及到网络的,都必须考虑线程安全问题.好了,开始噼里啪啦地开始敲代码之前,我觉得有必要了解一些文绉绉的理论知识,因为这些理论知识是我们敲出来的代码是否是线程安全的一个依据. 当多个线程访问某个状态变量并且其中有一个线程执行写入操作的时候,必须考虑采用同步机制来协同这些线程对变量的访问,Java中的主要同步机制是关键字synchronized,它提供了一种独占的加锁方式,但"同步"这个术语还包括类型的变量,显

Java并发编程初探

package test; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.io.Reader; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; imp

并发编程-process对象的其他属性方法

join方法: # join方法 from multiprocessing import Process import time,os def task(): print('%s is running,parent id is <%s>' %(os.getpid(),os.getppid())) time.sleep(3) print('%s is done,parent id is <%s>'%(os.getpid(),os.getppid())) if __name__ ==

Python并发编程—线程对象属性

线程对象属性 t.name 线程名称 t.setName() 设置线程名称 t.getName() 获取线程名称 t.is_alive() 查看线程是否在生命周期 t.daemon 设置主线程和分支线程的退出关系 t.setDaemon() 设置daemon属性值 t.isDaemon() 查看daemon属性值 daemon为True时主线程退出分支线程也退出.要在start前设置,通常不和join一起使用. 1 from threading import Thread 2 from time

《Java并发编程实战》第三章 对象的共享 读书笔记

一.可见性 什么是可见性? Java线程安全须要防止某个线程正在使用对象状态而还有一个线程在同一时候改动该状态,并且须要确保当一个线程改动了对象的状态后,其它线程能够看到发生的状态变化. 后者就是可见性的描写叙述即多线程能够实时获取其它线程改动后的状态. *** 待补充   两个工人同一时候记录生产产品总数问题 1. 失效数据 可见性出现故障就是其它线程没有获取到改动后的状态,更直观的描写叙述就是其它线程获取到的数据是失效数据. 2. 非原子64位操作 3. 加锁与可见性 比如在一个变量的读取与

java并发编程实战学习笔记之对象的组合与基础构建模块

第四章 对象的组合 4.1 构建安全的类 4.2 实例封闭 @ThreadSafe public class PersonSet {     @GuardedBy("this") private final Set<Person> mySet = new HashSet<Person>();     public synchronized void addPerson(Person p) {         mySet.add(p);     }     pub

[Java 并发] Java并发编程实践 思维导图 - 第四章 对象的组合

根据<Java并发编程实践>一书整理的思维导图. 第一部分: 第二部分:

Java 并发编程(四):如何保证对象的线程安全性

本篇来谈谈 Java 并发编程:如何保证对象的线程安全性. 01.前言 先让我吐一句肺腑之言吧,不说出来会憋出内伤的.<Java 并发编程实战>这本书太特么枯燥了,尽管它被奉为并发编程当中的经典之作,但我还是忍不住.因为第四章"对象的组合"我整整啃了两周的时间,才啃出来点肉丝. 读者朋友们见谅啊.要怪只能怪我自己的学习能力有限,真读不了这种生硬无趣的技术书.但是为了学习,为了进步,为了将来(口号喊得有点大了),只能硬着头皮上. 请随我来,我尽量写得有趣点. 02.线程安全类