`

并发变成学习三(对象的共享)

 
阅读更多

1.可见性:为了确保多个线程之间的内存写入操作的可见性,必须使用同步机制。在没有使用同步的情况下,编译器,处理器以及运行时等都有可能对操作的执行顺序进行一些意想不到的调整。

2.加锁可见性: a,内置锁可以用于确保某个线程以一种可预见的方式来查看另外一个线程的执行结果。
      b,java语言提供了一种稍弱的同步机制,即volatile变量,用来确保将变量的更新操作通知到其他线程,当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的,因此不会将该变量上的操作与其他内存操作一起重排序。

3,线程封闭:当访问共享的可变数据时,通常需要使用同步,一种避免使用同步的方式就是不共享数据。如果仅在单线程内访问数据,就不需要使用同步,这种技术称为线程封闭。

ThreadLocal: ThreadLocal对象通常用于防止对可变的单实例变量(Singleleton)或全局变量进行共享。

4.不可变对象一定是线程安全的。不可变性并不等于将对象中的所有的域都申明为final类型,这个对象仍然是可变的。因为在final类型的域中可保存对可变对象的引用。

5.当满足以下条件时,对象才是不可变的:
    对象创建以后其状态就不能改变
    对象的所有域都是final类型
    对象是正确创建的(在对象创建期间,this引用没有逸出)

6.任何线程都可以在不需要额外同步的情况下安全的访问不可变对象,即使在发布这些对象时没有使用同步。

7.安全发布的常用模式:可变对象必须通过安全的方式发布,这通常都意味着在发布和使用该对象的线程时都必须使用同步。
要安全的发布一个对象,对象的引用以及对象的状态必须同时对其他线程可见,一个正确构造的对象可以通过以下方式来安全发布。
   a,在静态初始化函数中初始化一个对象引用
   b,将对象的引用保存在volatile类型或者AtomicReferance对象中
   c,将对象的引用保存到某个正确构造对象的final类型域中
   d,将对象的引用保存到一个由锁保护的域中
常用的线程安全集合:HashTable,SynchronizedMap,ConcurrentMap,Vector,CopyONWriteArrayList,CopyOnWriteArrayList,SynchronizedList,SynchronizedSet,BlockingQueue,ConcurrentLinkedQueue
将某个元素加入到这些集合中,则可以将该元素安全发布到任何访问这些元素的线程中。

8.通常要发布一个静态构造的对象,最简和最安全的方式是使用静态的初始化器。
eg:public static Holder holder = new  Holder(42);
静态初始化器由JVM在类的初始化阶段执行,由于在JVM内部存在着同步机制,因此通过这种方式初始化的任何对象都可以安全发布。











分享到:
评论

相关推荐

    Java并发编程(学习笔记).xmind

    正确协同多个对象中的共享状态 正确协同远程对象本身状态的访问 Swing和AWT 事件处理器与访问共享状态的其他代码都要采取线程安全的方式实现 框架通过在框架线程中调用应用程序代码将并发性引入...

    Java对象锁

    在并发环境下,解决共享资源冲突问题时,可以考虑使用锁机制。  1.对象的锁  所有对象都自动含有单一的锁。  JVM负责跟踪对象被加锁的次数。如果一个对象被解锁,其计数变为0。在任务(线程)第一次给对象加锁...

    三层ADO的Internet远程数据库访问开发套件

    同时支持原生ADO访问模式和三层的扩展访问模式,开发过程同C/S模式一样,运行时设定Enabled属性,即可从C/S变成三层,随时切换模式。 3、后台自动连线机制 客户端在长时间使用过程中,如果网络异常断线,恢复后可...

    Java的六大问题你都懂了吗

    在多线程的操作中,一个对象会被多个线程共享或修改,一个线程对对象无意识的修改可能会导致另一个使用此对象的线程崩溃。一个错误的解决方法就是在此对象新建的时候把它声明为final,意图使得它"永远不变".其实那是...

    WebSphere参数调优.txt

    要求远程方法一律使用参数值传递方式来调用,如果调用EJB的Servlet或者其它EJB是部署在同一个应用服务器下,那么它们是共享一个JVM的,也就是说可以使得函数调用的方式变为参数引用传递,这样的话,视参数对象的复杂...

    二十三种设计模式【PDF版】

    所以很少存在简单重复的工作,加上Java 代码的精炼性和面向对象纯洁性(设计模式是 java 的灵魂),编程工作将变成一个让你时刻 体验创造快感的激动人心的过程. 为能和大家能共同探讨"设计模式",我将自己在学习中的心得...

    java面试800题

    "类的初始化过程 当创建一个对象时,对象的各个变量根据其类型被设置为相应的默认初始值,然后调用构造方法,而每次调用构造方法都是要执行三个阶段: 1.调用超类的构造方法; 2.由初始化语句对给变量进行初始化...

    Oracle DBA 参考手册

    1.5. 我如何能够从一名DBA初学者变为一个具有中级水平的DBA? 14 1.5.1. 步骤#1: 学习操作系统和你的服务器硬件 14 1.5.2. 步骤#2: 学习应用程序设计因为它与数据库相关 14 1.5.3. 步骤#4: 取得认证 14 1.5.4. 步骤#...

    《计算机操作系统》期末复习指导

    主要有:响应比,并发性,信息的共享、保密与保护,可扩充性、可移植性、可读性、可“生成”性,安全可靠性,可测试性等。 第二章 用户与操作系统的接口 1、基本概念 作业(Job)是让计算机完成一件事或...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    Blog 作为一种新的生活方式、新的工作方式、新的学习方式已经被越来越多的人所接受,并且在改变传统的网络和社会结构:网络信息不再是虚假不可验证的,交流和沟通更有明确的选择和方向性,单一的思想和群体的智慧...

    oracle数据库dba管理手册

    9.5.3 变成另一个用户 255 9.6 审计 257 9.6.1 登录审计 257 9.6.2 操作审计 258 9.6.3 对象审计 259 9.7 保护审计跟踪 260 9.8 分布式环境的安全性 260 9.9 解决方案 260 第10章 优化备份和恢复过程 262 10.1 特性 ...

    基于J2EE框架的个人博客系统项目毕业设计论...

    Blog 作为一种新的生活方式、新的工作方式、新的学习方式已经被越来越多的人所接受,并且在改变传统的网络和社会结构:网络信息不再是虚假不可验证的,交流和沟通更有明确的选择和方向性,单一的思想和群体的智慧...

    ASP EXCEL导入SQL

    AJAX技术还使得软件更好地实现分布性功能,在一个企业内只要一个人下载了AJAX引擎,其它企业内部的人员,就可以共享该资源了。AJAX技术遵守REST准则的应用程序中简单和可伸缩的架构,凡是采用AJAX技术的页面简洁而又...

    cmd操作命令和linux命令大全收集

    copy 1st.jpg/b+2st.txt/a 3st.jpg 将2st.txt的内容藏身到1st.jpg中生成3st.jpg新的文件,注:2st.txt文件头要空三排,参数:/b指二进制文件,/a指ASCLL格式文件 copy ipadmin$svv.exe c: 或:copyipadmin$*.* 复制...

    CuteFTP9简易汉化版

    并发transfers-Connect,浏览和导航多个站点同时进行。每个连接发生在自己的窗口。连接可以平铺的windows,级联,或通过点击访问相应的选项卡。 压缩Transfers-Compress文件和文件夹。邮政,。出租车,Gzip /原始码档案...

Global site tag (gtag.js) - Google Analytics