待续。。。

线程安全的类

之前学了很多线程安全的知识,现在导致了我每次用一个类或者做一个操作我就会去想是不是线程安全的。如果每次都这样的考虑的话就很蛋疼了,这里的思路是,将现有的线程安全组件组合为更大规模的组件或者程序(在内部已经控制了线程不安全的情形)。

通过封装技术,可以使得在不对整个程序进行分析的情况下就可以判断一个类是否是线程安全的。

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

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

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

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

对象的分为基本类型的变量和引用其他对象的变量,如果是引用了其他对象,那么该对象的状态也包含被引用对象的域。

例如,LinkedList的状态域就包括了该链表中所有节点对象的状态。

同步策略定义了如何在不违背对象不变条件或后验条件的情况下对其状态的访问操作进行协同。同步策略规定了如何将不变性、线程封闭与加锁机制等结合起来以维护线程的安全性。

收集同步需求

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

同样,在操作中还会包含一些后验条件来判断状态迁移是否有效。当下一步状态需要依赖当前状态时,这个操作就必须是一个复合操作,比如计数器,前一个是17那么,下一个一定是18。

如果是包含了多个变量的不变性条件将带来原子性需求:这些相关的变量必须在单个原子操作中进行读取或者更新。不能首先更新一个变量,然后释放锁并再次获得锁,然后再更新其他变量。因为释放锁之后,可能会使对象处于无效状态。

依赖状态的操作

在某些对象的方法中还包含一些基于状态的先验条件,例如,不能从空队列中移除一个元素,在删除前,队列必须处于“非空的“状态,这种称为依赖状态操作。

单线程中不满足先验条件那么只能失败,但是在并发程序中,先验条件可能会由于其他线程执行的操作而变成真。在并发程序中要一直等到先验条件为真,然后再执行该操作。

等待和通知机制都与内置加锁机制紧密关联。简单的方式是使用现有库中的类,比如BlockingQueue、Semaphore。

状态的所有权

容器类通常表现出一种“所有权分离”的形式,其中容器类拥有自身的状态,而客户代码则拥有有其中各个对象的状态。Servlet框架中的ServletContext就是其中一个示例。ServletContext为Servlet提供了类似于Map形式的对象容器服务器。Servlet容器实现的ServletContext对象必须是线程安全的,因为它肯定会被多个线程同时访问。Servlet容器只是提应用程序保管它们的对象。为了防止多个线程在并发访问同一个对象时产生的相互干扰,这些对象应该要么是线程安全的对象,要么是事实不可变的对象,或者由锁来保护的对象。

Java并发编程(十)设计线程安全的类的更多相关文章

  1. Java并发编程系列-(2) 线程的并发工具类

    2.线程的并发工具类 2.1 Fork-Join JDK 7中引入了fork-join框架,专门来解决计算密集型的任务.可以将一个大任务,拆分成若干个小任务,如下图所示: Fork-Join框架利用了 ...

  2. 【java并发编程实战】-----线程基本概念

    学习Java并发已经有一个多月了,感觉有些东西学习一会儿了就会忘记,做了一些笔记但是不系统,对于Java并发这么大的"系统",需要自己好好总结.整理才能征服它.希望同仁们一起来学习 ...

  3. Java并发编程:进程和线程的由来(转)

    Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够融会贯通 ...

  4. 【Java并发编程六】线程池

    一.概述 在执行并发任务时,我们可以把任务传递给一个线程池,来替代为每个并发执行的任务都启动一个新的线程,只要池里有空闲的线程,任务就会分配一个线程执行.在线程池的内部,任务被插入一个阻塞队列(Blo ...

  5. 【Java并发编程一】线程安全和共享对象

    一.什么是线程安全 当多个线程访问一个类时,如果不用考虑这些线程在运行时环境下的调度和交替执行,并且不需要额外的同步及在调用代码代码不必作其他的协调,这个类的行为仍然是正确的,那么称这个类是线程安全的 ...

  6. Java并发编程扩展(线程通信、线程池)

    之前我说过,实现多线程的方式有4种,但是之前的文章中,我只介绍了两种,那么下面这两种,可以了解了解,不懂没关系. 之前的文章-->Java并发编程之多线程 使用ExecutorService.C ...

  7. Java并发编程(01):线程的创建方式,状态周期管理

    本文源码:GitHub·点这里 || GitEE·点这里 一.并发编程简介 1.基础概念 程序 与计算机系统操作有关的计算机程序.规程.规则,以及可能有的文件.文档及数据. 进程 进程是计算机中的程序 ...

  8. Java并发编程学习:线程安全与锁优化

    本文参考<深入理解java虚拟机第二版> 一.什么是线程安全? 这里我借<Java Concurrency In Practice>里面的话:当多个线程访问一个对象,如果不考虑 ...

  9. Java并发编程(02):线程核心机制,基础概念扩展

    本文源码:GitHub·点这里 || GitEE·点这里 一.线程基本机制 1.概念描述 并发编程的特点是:可以将程序划分为多个分离且独立运行的任务,通过线程来驱动这些独立的任务执行,从而提升整体的效 ...

  10. java并发编程实战之线程安全性(一)

    1.1什么是线程安全性 要对线程安全性给出一个确切的定义是非常复杂的.最核心的概念就是正确性.正确性:某个类的行为与其规范完全一致.在良好的规范中通常会定义各种不变性条件来约束对象的状态,以及定义各种 ...

随机推荐

  1. angularjs自动加载和手动加载

    (一)自动加载 ng-app是angular的一个指令,代表一个angular应用(也叫模块).使用ng-app或ng-app=""来标记一个DOM结点,让框架会自动加载.也就是说 ...

  2. 在iPhone上取消APP订阅

    1.在iPhone上打开APP Store,在精品推荐那个界面滚动到底部. 2.点击Apple ID那一栏,如图: 3.点击查看Apple ID,如图: 4.点击管理,如图: 5.关掉此选项,如图: ...

  3. microsoft visual studio遇到了问题,需要关闭

    http://www.microsoft.com/zh-cn/download/confirmation.aspx?id=13821 装上这个补丁: WindowsXP-KB971513-x86-CH ...

  4. Debian6 安装Kscope(也适用于Ubuntu)

    参考:http://soft.chinabyte.com/os/134/12307634.shtml kscope1.6.2在这里下载,下载后解压出kscope-1.6.2.tar.gz. 在ubun ...

  5. php新浪云链接mysql与storage

    1.首先要有一个新浪云服务器 2.链接数据库获取数据 mysql CREATE TABLE Persons(FirstName varchar(255),LastName varchar(255)); ...

  6. jenkins结合docker

    参考:https://m.aliyun.com/yunqi/articles/80459?spm=5176.mtagdetail.0.0.vJJ8Gj 上面这篇文章讲述了一种工作思路:CICD(持续集 ...

  7. ylbtech-DBD-WeShop(微店)

    ylbtech-DatabaseDesgin:ylbtech-DBD-WeShop(微店) DatabaseName:WESHOP Model:微店数据设计 Type:专业技术网站 Url: 1.A, ...

  8. [C++]豆知识(1条)

    术语: ctor:constructor,构造函数 dtor:destructor,析构函数 构造函数/析构函数 如果基类要利用多态,则dtor需要声明为virtual,这样在销毁对象时才可以正确调用 ...

  9. java动态载入指定的类或者jar包反射调用其方法

    序言 有时候.项目中会用到java动态载入指定的类或者jar包反射调用其方法来达到模块的分离,使各个功能之间耦合性大大减少,更加的模块化.代码利用率更高.模式中的代理模式就用到java的这一机制. 下 ...

  10. 【C/C++学院】0831-类与对象的异常/面试100题1-100

    类与对象的异常 Cpp异常 #include <iostream> #include <string.h> using namespace std; //标识错误的类型 cla ...