Java并发编程(十)设计线程安全的类
待续。。。
线程安全的类
之前学了很多线程安全的知识,现在导致了我每次用一个类或者做一个操作我就会去想是不是线程安全的。如果每次都这样的考虑的话就很蛋疼了,这里的思路是,将现有的线程安全组件组合为更大规模的组件或者程序(在内部已经控制了线程不安全的情形)。
通过封装技术,可以使得在不对整个程序进行分析的情况下就可以判断一个类是否是线程安全的。
在设计线程安全的类的过程中,需要包含以下三个基本要素:
找出构成对象状态的所有变量。
找出约束状态变量的不变性条件。
建立对象状态的并发访问管理策略。
对象的分为基本类型的变量和引用其他对象的变量,如果是引用了其他对象,那么该对象的状态也包含被引用对象的域。
例如,LinkedList的状态域就包括了该链表中所有节点对象的状态。
同步策略定义了如何在不违背对象不变条件或后验条件的情况下对其状态的访问操作进行协同。同步策略规定了如何将不变性、线程封闭与加锁机制等结合起来以维护线程的安全性。
收集同步需求
对象与变量都有一个状态空间,即所有可能的取值,状态空间越小就越容易判断线程的状态。
同样,在操作中还会包含一些后验条件来判断状态迁移是否有效。当下一步状态需要依赖当前状态时,这个操作就必须是一个复合操作,比如计数器,前一个是17那么,下一个一定是18。
如果是包含了多个变量的不变性条件将带来原子性需求:这些相关的变量必须在单个原子操作中进行读取或者更新。不能首先更新一个变量,然后释放锁并再次获得锁,然后再更新其他变量。因为释放锁之后,可能会使对象处于无效状态。
依赖状态的操作
在某些对象的方法中还包含一些基于状态的先验条件,例如,不能从空队列中移除一个元素,在删除前,队列必须处于“非空的“状态,这种称为依赖状态操作。
单线程中不满足先验条件那么只能失败,但是在并发程序中,先验条件可能会由于其他线程执行的操作而变成真。在并发程序中要一直等到先验条件为真,然后再执行该操作。
等待和通知机制都与内置加锁机制紧密关联。简单的方式是使用现有库中的类,比如BlockingQueue、Semaphore。
状态的所有权
容器类通常表现出一种“所有权分离”的形式,其中容器类拥有自身的状态,而客户代码则拥有有其中各个对象的状态。Servlet框架中的ServletContext就是其中一个示例。ServletContext为Servlet提供了类似于Map形式的对象容器服务器。Servlet容器实现的ServletContext对象必须是线程安全的,因为它肯定会被多个线程同时访问。Servlet容器只是提应用程序保管它们的对象。为了防止多个线程在并发访问同一个对象时产生的相互干扰,这些对象应该要么是线程安全的对象,要么是事实不可变的对象,或者由锁来保护的对象。
Java并发编程(十)设计线程安全的类的更多相关文章
- Java并发编程系列-(2) 线程的并发工具类
2.线程的并发工具类 2.1 Fork-Join JDK 7中引入了fork-join框架,专门来解决计算密集型的任务.可以将一个大任务,拆分成若干个小任务,如下图所示: Fork-Join框架利用了 ...
- 【java并发编程实战】-----线程基本概念
学习Java并发已经有一个多月了,感觉有些东西学习一会儿了就会忘记,做了一些笔记但是不系统,对于Java并发这么大的"系统",需要自己好好总结.整理才能征服它.希望同仁们一起来学习 ...
- Java并发编程:进程和线程的由来(转)
Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够融会贯通 ...
- 【Java并发编程六】线程池
一.概述 在执行并发任务时,我们可以把任务传递给一个线程池,来替代为每个并发执行的任务都启动一个新的线程,只要池里有空闲的线程,任务就会分配一个线程执行.在线程池的内部,任务被插入一个阻塞队列(Blo ...
- 【Java并发编程一】线程安全和共享对象
一.什么是线程安全 当多个线程访问一个类时,如果不用考虑这些线程在运行时环境下的调度和交替执行,并且不需要额外的同步及在调用代码代码不必作其他的协调,这个类的行为仍然是正确的,那么称这个类是线程安全的 ...
- Java并发编程扩展(线程通信、线程池)
之前我说过,实现多线程的方式有4种,但是之前的文章中,我只介绍了两种,那么下面这两种,可以了解了解,不懂没关系. 之前的文章-->Java并发编程之多线程 使用ExecutorService.C ...
- Java并发编程(01):线程的创建方式,状态周期管理
本文源码:GitHub·点这里 || GitEE·点这里 一.并发编程简介 1.基础概念 程序 与计算机系统操作有关的计算机程序.规程.规则,以及可能有的文件.文档及数据. 进程 进程是计算机中的程序 ...
- Java并发编程学习:线程安全与锁优化
本文参考<深入理解java虚拟机第二版> 一.什么是线程安全? 这里我借<Java Concurrency In Practice>里面的话:当多个线程访问一个对象,如果不考虑 ...
- Java并发编程(02):线程核心机制,基础概念扩展
本文源码:GitHub·点这里 || GitEE·点这里 一.线程基本机制 1.概念描述 并发编程的特点是:可以将程序划分为多个分离且独立运行的任务,通过线程来驱动这些独立的任务执行,从而提升整体的效 ...
- java并发编程实战之线程安全性(一)
1.1什么是线程安全性 要对线程安全性给出一个确切的定义是非常复杂的.最核心的概念就是正确性.正确性:某个类的行为与其规范完全一致.在良好的规范中通常会定义各种不变性条件来约束对象的状态,以及定义各种 ...
随机推荐
- Java多线程——ReentrantReadWriteLock源码阅读
之前讲了<AQS源码阅读>和<ReentrantLock源码阅读>,本次将延续阅读下ReentrantReadWriteLock,建议没看过之前两篇文章的,先大概了解下,有些内 ...
- iOS viewDidLoad 什么时候调用
- (void)viewDidLoad; // Called after the view has been loaded. For view controllers created in code, ...
- 原始DAO开发
1,pojo package com.songyan.dao; import com.songyan.pojo.Student; public interface StudentDao { publi ...
- [bug] VS2013 Brower Link和Aspnetpager引发的问题分析
概述 在ie11上浏览页面的时候,突然发现在使用Aspnetpager的页面会有一个bug. 开发环境:win8.1+vs2013+ie11. 项目描述:这个问题出现在内容页中,应用了母版页. 解决方 ...
- [Java基础] Java多线程-工具篇-BlockingQueue
转载自: http://www.cnblogs.com/jackyuj/archive/2010/11/24/1886553.html 前言: 在新增的Concurrent包中,BlockingQue ...
- Android Studio NDK 新手教程(5)--Java对象的传递与改动
概述 本文主要Java与C++之间的对象传递与取值.包括传递Java对象.返回Java对象.改动Java对象.以及性能对照. 通过JNIEnv完毕数据转换 Java对象是存在于JVM虚拟机中的,而C+ ...
- spring注入之使用标签 @Autowired @Qualifier
使用标签的缺点在于必需要有源代码(由于标签必须放在源代码上),当我们并没有程序源代码的时候.我们仅仅有使用xml进行配置. 比如我们在xml中配置某个类的属性 <bea ...
- diamond淘宝框架使用
转载:http://blog.csdn.net/coolyqq/article/details/50435634 一.概况 diamond是淘宝内部使用的一个管理持久配置的系统,它的特点是简单.可靠. ...
- ns3加入模块之vanet-highway
在网上搜了下加入模块的教程,搜到了一个帖子:ns3加入模块 ,可是这个帖子只给出了如何加入的步骤.我认为写的比較简单,当我们须要加入别的模块时就不知道如何操作了. 所以,我写这个帖子,会将非常多遇到的 ...
- MPTCP 源码分析(四) 发送和接收数据
简述: MPTCP在发送数据方面和TCP的区别是可以从多条路径中选择一条 路径来发送数据.MPTCP在接收数据方面与TCP的区别是子路径对无序包 进行重排后,MPTCP的mpcb需要多所有子 ...