线程安全-常用的模式

线程安全-常用的模式

    • 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并发编程的艺术》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/423019.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【OS学习笔记】十四 保护模式二:段描述符

上一篇文章初步进入保护模式的学习。首先学习了全局描述符表GDT。点击链接查看上一篇文章:全局描述符表 本篇文章继续学习,GDT中存放的条目:描述符,确切的说是段描述符。学习段描述符的作用以及段描述符的格式。 1、段描述符的格…

11月最流行的笑话

我说这位大哥,我又不是草船,你的贱用不着总往我这儿乱发! 如果我的人生是一部电影,你就是那弹出来的广告。 别跟姐问东问西,baidu比姐懂的多,有问题找他去! 没有谁瞧不起你,因为别人…

前端学习(174):图片热区链接

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/ html4/strict.dtd"> <html><head><meta http-equiv"content-type" content"text/html; charsetutf-8"><title>超链接——图…

软件基础思维导图

软件基础1.进程和线程的多种状态2.软件基础1.进程和线程的多种状态 2.软件基础

【OS学习笔记】十五 保护模式三:保护模式下的内存访问机制

上一篇文章学习了段描述符与段描述符各个标志位的含义&#xff1a;段描述符 本篇文章学习如何进入保护模式&#xff0c;并学习如何在保护模式下进行内存访问。 1、如何进入保护模式 假设我们已经用汇编语言将段描述符安装到GDT中&#xff08;具体的汇编代码在后面的文章中会…

前端学习(175):弹窗

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/ html4/strict.dtd"> <html><head><meta http-equiv"content-type" content"text/html; charsetutf-8"><title>超链接——J…

存储过程里调用另一个存储过程的值

第一种: USE [WMS]GO DECLARE return_value int EXEC return_value [dbo].[Sys_GetSysNo] NoCode ND001 SELECT Return Value return_value GO 第二种:创建一个临时表 create proc GetUserNameasbegin select UserNameend Create table #tempTable (userName nvarchar(…

【OS学习笔记】十六 保护模式四:进入保护模式与在保护模式下访问内存的汇编代码

本文记录的是之前四篇文章所对应的汇编代码。四篇文章分别是&#xff1a; 【OS学习笔记】十二 现代处理器的结构和特点【OS学习笔记】十三 保护模式一&#xff1a;全局描述符表&#xff08;GDT&#xff09;【OS学习笔记】十四 保护模式二&#xff1a;段描述符【OS学习笔记】十…

前端学习(176):列表元素

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/ html4/strict.dtd"> <html><head><meta http-equiv"content-type" content"text/html; charsetutf-8"><title>有序列表<…

RDLC报表---自定义数据集

//连接字符串stringconnstr "Data Source.;Initial CatalogWWALMDB;User IDsa;Passwordsqlsql";//新建连接SqlConnection connection newSqlConnection(connstr);//查询命令SqlCommand command newSqlCommand(textBoxSQL.Text, connection);//适配器SqlDataAdapter a…

设计模式-装饰者模式

1. 场景 很经典的一个场景 咖啡类型 espresso&#xff08;意大利咖啡&#xff09;&#xff0c;shortblack,LongBlack(美食咖啡)&#xff0c;Decaf(无因咖啡)调料 Milk ,Soy(豆浆)&#xff0c;Chocolate费用 不同的咖啡价格是不同的&#xff0c;而且有 咖啡调料的类型组合 每个咖…

【OS学习笔记】十七 保护模式五:保护模式下如何进行内存保护 与 别名段的意义与作用

上一篇文章学习了如何进入保护模式&#xff0c;以及如何在保护模式下进行内存访问。点击链接查看上一篇文章&#xff1a;进入保护模式与在保护模式下访问内存 首先说明本片文章有对应的汇编代码&#xff0c;点击链接查看&#xff1a;点击查看 本篇文章接着学习。我们已经知道…

前端学习(177):定义列表

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/ html4/strict.dtd"> <html><head><meta http-equiv"content-type" content"text/html; charsetutf-8"><title>定义列表<…

oracle 数据库工作总结思维导图

oracle 数据库工作中使用总1. oracle 数据库 工作中使用总结思维导图2 解析oracle执行计划1. oracle 数据库 工作中使用总结思维导图 2 解析oracle执行计划 执行计划树的基本规则如下&#xff1a; 执行计划将包含一个根&#xff0c;没有父&#xff08;操作&#xff09; 父&…

【软件开发底层知识修炼】十一 链接器-链接脚本

上一篇文章学习了链接器之-main函数不是第一个执行的函数:main函数不是第一个执行的函数 今天继续学习链接器&#xff0c;学习链接是如何动作的&#xff0c;从而引入链接脚本的概念。本文就学习链接脚本的概念。 1、链接脚本的作用 我们都知道可重定位文件经过链接器链接后最…

as3 physaxe 2d 物理引擎

http://drawlogic.com/2008/04/06/physaxe-2d-flash-physics-kit-for-haxe-and-list-of-flash-flex-actionscript-physics-engines-for-as3/转载于:https://www.cnblogs.com/vilyLei/archive/2010/11/30/1892298.html

前端学习(178):表格元素

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/ html4/strict.dtd"> <html><head><meta http-equiv"content-type" content"text/html; charsetutf-8"><title>表格</ti…

java后端分享整理

java规范总结1. Java 常见的代码规范1.1. Java 自带的工具方法1.1.1 比较两个对象是否相等1.1.2 apache commons工具类库1.1.2.1 字符串判空1.1.2.3 重复拼接字符串1.1.2.4 格式化日期1.1.2.4 包装临时对象 &#xff08;不是特别常用&#xff09;1.1.3 common-beanutils 操作对…

【OS学习笔记】十八 保护模式五:保户模式下如何进行内存保护 与 别名段的意义与作用 对应汇编代码

本片文章是上一篇文章&#xff1a;点击查看对应的汇编代码。可以学习上一篇文章后再来对照查看汇编代码。或者查阅书籍《X86汇编语言-从实模式到保护模式》点击下载第12章内容来学习。 ;代码清单12-1;文件名&#xff1a;c12_mbr.asm;文件说明&#xff1a;硬盘主引导扇区代码 ;设…

SharePoint要在master page中动态显示List数据的几种方式

我们都知道&#xff0c;在SharePoint中&#xff0c;Content page继承自Page layout&#xff0c;而Page layout又继承自Master page。Master page的作用大家都知道&#xff0c;它定义了站点的的整体外观和公共元素&#xff0c;因此有了很强的页面重用性和很好的页面编辑体验&…