线程安全-常用的模式

  • 1.对象安全发布的几种方式
  • 2. 线程安容器
  • 3.使用静态初始化器 发布安全对象
  • 4. 扩展
    • 4.1 名词解释
    • 4.2 互斥的理解
    • 4.3 同步的理解
    • 4.4 安全发布

1.对象安全发布的几种方式

安全发布一个对象,对象的引用和对象的状态,必须是对其他对象可见的。
下面是对象可以安全发布的几种方式

  • 在静态函数中初始化一个对象
  • 将对象保存到 volatile 或者 atomicReferance对象中
  • 将对象的引用保存到 某个正确构造对象的 final 类型域中国。
  • 将对象引用保存到一个由锁保护的域中。

线程安全容器的同步,指的是 将对象放入到某个容器 即:(将对象引用保存到一个由锁保护的域中)

  • 例如 vector ,synchronizedList 中。 如果线程A 将对象X放入到 一个线程安全的容器中,随候线程B读取这个对象,那么可以确保B 看到线程A 设置X的状态,即便 这块读/写 X应用程序代码没有包含在显示的同步。

2. 线程安容器

后续补充

3.使用静态初始化器 发布安全对象

通常 发布一个静态构造对象 ,是最简单和最安全的方式,是使用静态初始化器。
下面展示一些 内联代码片

public static Holder  holder = new Holder(42);

静态初始化器由jvm 在类的初始化阶段执行。由于jvm 内部的同步机制,因此通过这种方式 初始化任何对象 都可以被安全的发布。

4. 扩展

4.1 名词解释

  • 安全发布
  • 安全性失败
  • 活性失败

4.2 互斥的理解

互斥:当一个对象被一个线程修改的时候,可以阻止另一个线程观察到对象内部的不一致的状态。可以理解为,对象被创建的时候处于一致的状态,当有方法访问它的时候,它就被锁定了。这些方法观察到对象的状态,并且可能会引起状态转变,即把对象从一个状态转换到另一种状态。正确的使用同步可以保证没有任何方法会看到对象处于不一致的状态。

4.3 同步的理解

1.同步 对进入同步方法或者同步代码块的每个线程,都看到由同一个锁保护的之前所有的修改结果。
2.阻止没有进入的到同步方法或者代码块的线程,看到对象处于不一致的状态。
3.同步归功于 java内容模型,它规定了一个线程所做的变化何时以及如何变成,对其他线程可见。

4.4 安全发布

  • 1.将它保存在静态域中。
  • 2.作为类初始化的一部分。
  • 3.可以保存在volatile,final。
  • 4.者通过正常锁定访问的域中。
  • 5.将它放在并发集合中。

总结:

  • 只有共享的数据(全局指的是 工具类,或者是全局缓存类,工具类中的成员变量,使用日期转化SimpleDateFormat ),需要考虑线程安全问题。
    项目中的DTO 代码中的 非全局共享的,使用的对象用不到 线程安全,也不用考虑线程安全问题,调用过程中,每次都会创建对象。
  • 参考:
  • 《effective java》
  • 《java并发编程的艺术》

线程安全-常用的模式相关推荐

  1. 线程池与工厂模式、代理模式的结合使用

    为了提高代码的效率,我们经常会使用到线程池,那在实际项目工作中,如何将线程池与工厂模式和代理模式结合使用,使我们的代码更高效,更具有面象对象的思想,以及维护和拓展性更高呢? 接下来,我将结合下列代码讲 ...

  2. java网站开发模式有哪些_第7章JavaWeb常用开发模式.ppt

    第7章JavaWeb常用开发模式.ppt 7.4.4 JSP+Servlet+JavaBean案例 --学生体质信息管理系统 [例7-10]采用JSP+Servlet+JavaBean+JDBC+My ...

  3. LeetCode常用算法模式大厂面试题整理

    转载自  LeetCode常用算法模式&大厂面试题整理 文章目录 1.滑动窗口 2.双指针 3.快慢指针 4.合并区间 5.循环排序 6.就地反转链表 7.堆-优先队列问题 8.Top K 9 ...

  4. 单元测试中的常用测试模式

    单元测试跟软件设计一样,有一些常用的模式,这篇 文章是介绍一些常用的模式,其中的示例是C#代码,都比较简单,我想大家都能看懂.下面进入正题: 1.准备,执行,断言(Arrange, Act, Asse ...

  5. 超低功耗蓝牙模块的常用工作模式

    转贴 超低功耗蓝牙模块的常用工作模式 http://www.openedv.com/thread-86300-1-1.html (出处: OpenEdv-开源电子网) 超低功耗蓝牙4.0模块,用于点对 ...

  6. 第2课:JSP常用开发模式 (黄菊华Java网站开发系列教程)

    JSP常用开发模式 单纯的JSP编程 在 JSP 编程模式下,通过应用 JSP 中的脚本标志,可以直接在 JSP 页面中实现各种功能.虽然这种模式很容易实现,但是,其缺点也非常明显.因为将大部分的 J ...

  7. Redis常用架构模式

    文章目录 一.Redis常用架构模式 1.单机模式 优点 缺点 2.主从模式 常用的主从方式 优点 缺点 3.哨兵模式 关键词解释 哨兵模式工作原理 优点 缺点 4.集群模式 分片 优点 缺点 二.s ...

  8. Java线程实现生产者—消费者模式

    在这里插入代码片# Java 线程实现生产者-消费者模式 ##思路:实现类似消费者生产者线程之间通讯的功能,每创建一个工人,就让这个工人干活,干一段时间,工人自动消失,然后又去创建一个工人干活: 代码 ...

  9. .net开发笔记(十三) Winform常用开发模式第一篇

    上一篇博客最后我提到"异步编程模型"(APM),之后本来打算整理一下这方面的材料然后总结一下写篇文章与诸位分享,后来在整理的过程中不断的延伸不断地扩展,发现完全偏离了"异 ...

最新文章

  1. 四年级下册英语计算机房和教师办公室的图片,PEP英语四年级下册-Unit-1思维导图及知识点梳理.pptx...
  2. Content Compression Resistance和Content Hugging
  3. Delphi识别读取验证码
  4. GBDT(回归树)原理详解与python代码实现
  5. STM32F103实现点灯(寄存器方式)
  6. linux 第一个内核模块Hello World
  7. python实现简单爬虫抓取图片
  8. 插件 KSImageNamed 用图片时自动显示图片缩略图
  9. 盘式制动优于鼓式制动吗?
  10. Open3d之网格变形
  11. 折腾一天,获取下列多选框的所有选中值,原生js可直接通过obj.val()来获取,可jq不行,要通过循环取值来获取;...
  12. LQR控制基本原理(包括Riccati方程具体推导过程)
  13. 推荐一些socket工具,TCP、UDP调试、抓包工具
  14. 退货地址导出(拼多多)
  15. C语言cat函数的功能,R语言cat()函数
  16. java做界面_java怎么做出界面?实例讲解
  17. 黑客必知投资人的那点事儿——The Hacker’s Guide to Investors
  18. Pytorch:VGG16
  19. ELK集群部署报错(master not discovered yet, this node has not previously joined a bootstrapped )
  20. Theory for the information-based decomposition of stock price

热门文章

  1. java学习(133):泛型
  2. java中异常+连接重置_是什么导致我的java.nett.ocketException:连接重置?
  3. mysql执行过程五步_简单五步教你搭建MySQL主从复制
  4. tensorflow 目标分割_Tensorflow中的控制流和优化器
  5. MPP install
  6. 巧妙解决element-ui下拉框选项过多的问题
  7. Eclipse 使用 CodeMix 插件 开发 Vue.js
  8. angular - 如何运行在起来 - 使用nginx
  9. linux--GCC简单用法
  10. 387. First Unique Character in a String