待续。。。

线程安全的类

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

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

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

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

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

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

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

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

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

收集同步需求

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

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

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

依赖状态的操作

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

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

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

状态的所有权

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

转载于:https://www.cnblogs.com/tuhooo/p/8029317.html

Java并发编程(十)设计线程安全的类相关推荐

  1. [Java 并发编程实战] 设计线程安全的类的三个方式(含代码)

    发奋忘食,乐以忘优,不知老之将至.---<论语> 前面几篇已经介绍了关于线程安全和同步的相关知识,那么有了这些概念,我们就可以开始着手设计线程安全的类.本文将介绍构建线程安全类的几个方法, ...

  2. java并发编程实践(2)线程安全性

    [0]README 0.0)本文部分文字描述转自:"java并发编程实战", 旨在学习"java并发编程实践(2)线程安全性" 的相关知识: 0.1)几个术语( ...

  3. Java并发编程-无锁CAS与Unsafe类及其并发包Atomic

    [版权申明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/72772470 出自[zejian ...

  4. Java并发编程—什么是线程?

    原文作者:way_more 原文地址:Java 多线程常见基础面试题总结,面试必看! 目录 一.什么是线程和进程? 二.简要描述线程与进程的关系 三.FAQ 一.什么是线程和进程? 1.1. 何为进程 ...

  5. java并发编程第一课 线程的创建、停止和状态变更

    开篇词: 由点及面,搭建你的 Java 并发知识网 你好,欢迎学习<Java 并发编程核心 78 讲>,我是讲师星星,一线互联网公司资深研发工程师,参与过集团内多个重点项目的设计与开发. ...

  6. Java并发编程 synchronized保证线程安全的原理

    文章转载致博客 blog.csdn.net/javazejian/- 自己稍加完善. 线程安全是并发编程中的重要关注点,应该注意到的是,造成线程安全问题的主要诱因有两点,一是存在共享数据(也称临界资源 ...

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

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

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

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

  9. Java并发编程(04):线程间通信,等待/通知机制

    本文源码:GitHub·点这里 || GitEE·点这里 一.概念简介 1.线程通信 在操作系统中,线程是个独立的个体,但是在线程执行过程中,如果处理同一个业务逻辑,可能会产生资源争抢,导致并发问题, ...

  10. Java并发编程(十六):CyclicBarrier源码分析

    前言   CyclicBarrier可以建立一个屏障,这个屏障可以阻塞一个线程直到指定的所有线程都达到屏障.就像团队聚餐,等所有人都到齐了再一起动筷子.根据Cyclic就可以发现CyclicBarri ...

最新文章

  1. MongoDB或CouchDB - 适合生产? [关闭]
  2. python 杀死一个线程
  3. Android-上传图片(二)_HttpClient
  4. innerhtml js执行_JS 中 DOM 操作
  5. 三数之和(Java、C实现)
  6. 【腾许Bugly干货分享】“HTTPS”安全在哪里?
  7. linux uniq命令_如何在Linux上使用uniq命令
  8. HDU1856More is better(并查集)
  9. 项目安装使用uuid_在uniapp中使用fingerprint2实现游客设备标识
  10. llvm vs gcc 我被雷到了, 速度相差300多倍,你还用GCC吗!【转】
  11. Trick(十一)—— list of lists 每一个属性列的获取
  12. uc/os-II的内存改进与实现TLSF算法的详解,移植实现(三)
  13. J2EE和.NET技术
  14. CPU占用100%的一般原因及解决办法
  15. android系统裁剪之APP精简
  16. vue-echarts绘制地图轮廓
  17. Dubbo跟Spring Cloud哪个更好用?“微服务”第二代又赢了!
  18. 前端常见图片格式整理
  19. Java基础の乱弹琴一:assert关键字
  20. 超强反爬虫方案!Requests 什么的通通爬不了

热门文章

  1. mac终端python删除键不能用_我把mac 系统下的python目录删掉了怎么办
  2. 【机器学习】解决中小微企业的信贷决策问题(一)
  3. 【机器学习】Apriori 算法进行关联分析和FP-growth算法
  4. startservice方式启动服务
  5. 7-22 堆栈模拟队列 (25 分)
  6. php 输出去掉 字符,PHP:如何删除字符串中所有不可打印的字符?
  7. mapper注解的主要作用_Mybatis中mapper的xml解析详解
  8. 网络营销专员浅析网络营销推广基本形式你更中意哪种?
  9. 浅析网站标题优化该如何进行?
  10. 浅析搜索引擎对网站的抓取规则有哪些方面