`
ray_yui
  • 浏览: 216783 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

并发编程 — 实现线程安全

    博客分类:
  • Java
阅读更多

并发编程系列文章:
      初解线程池:http://ray-yui.iteye.com/blog/2072463
      详解线程池:http://ray-yui.iteye.com/blog/2075311
      并发数据类型:http://ray-yui.iteye.com/blog/2080454
      并发数据结构:http://ray-yui.iteye.com/blog/2084202
      volatile:http://ray-yui.iteye.com/blog/2231474
      判断线程安全:http://ray-yui.iteye.com/blog/2232931
      实现线程安全:http://ray-yui.iteye.com/blog/2234688


      在多线程程序开发当中,可以使用一些编程技巧规避线程安全问题或减少使用锁导致的额外开销.


1.线程封闭
      当多个线程访问修改同一对象时需要使用同步机制,其中一种规避方法是不共享任何数据.参数传入线程时传入变量的复制.或所有变量/对象都从线程当中创建.这种方法将所有线程所能触及的变量都封闭在线程内部本身,即使被封闭的对象不是线程安全,也可以达到线程安全的效果.


2.实例封闭
      当一个对象被封闭在另一个新创建的对象当中时,能访问该对象的所有代码路径都是已知的.例如struct2中的Action就是使用实例封闭的方式实现线程安全.框架保证每一个请求都创建一个全新的Action对象,从而将线程安全委托给实例封闭


3.栈封闭
      栈封闭的使用方式在三层架构当中非常常用.通常使用在封闭的方法当中,方法只操作传入参数进行业务处理.例如service只操作通过上层传入的参数调用DAO层,SpringMVC由于Controller是单例对象,所有的操作都在方法级别进行栈封闭从而实现线程安全.


4.ThreadLocal
      ThreadLocal在多线程的Web系统中应用非常广泛,如Struct2的ActionContext.JSF的FacesContext.Spring的Transactional都是通过ThreadLocal实现.ThreadLocal允许被置入的对象访问域提升到线程的级别.但使用ThreadLocal时需要注意,这是一种变量侵入式的设计.ThreadLocal的设置位置可能和读取位置相隔甚远,甚至无法从代码调用的上下文中寻找到设置该变量的位置.这导致业务逻辑依赖ThreadLocal.


5.不变对象
      不变对象天生对多线程环境友好.当一个对象创建后就没有任何代码路径会修改对象中的属性.由于没有提供任何方法对其属性修改,因此可以自由地在多线程中共享访问.但需要注意并非不提供setter方法就视为不变对象,而是所有暴露出去的方法中没有任何一个会对属性进行修改.对象的所有属性在创建对象时已经确定.并且不会有改变


6.委托并发容器发布对象
      Java当中提供了很多线程安全的容器.当一个对象通过线程安全容器进行发布时,我们可以认为这个对象已被安全的发布出去并处于线程安全状态.


总结:
      以上实现线程安全的方式都不曾提及公有的静态变量.而公有的静态变量往往是容易被忽略导致线程安全问题发生的原因.包括一些全局的作用域例如HttpServletRequest操作Application作用域时,由于Application是全局共享的,所以当操作Application时仍然需要同步操作.
5
5
分享到:
评论

相关推荐

    Java高并发编程,构建并发编程知识体系,提升面试成功率

    本课程将结合大量图示及代码演示,带你掌握多线程并发编程(线程安全,线程调度,线程封闭,同步容器等)与高并发处理思路与手段(扩容,缓存,队列,拆分等),构建完整的并发与高并发知识体系,胜任实际开发中并发...

    并发编程实践,全面介绍基础知识、JVM同步原语、线程安全、低级并发工具、线程安全容器、高级线程协作工具、Executor部分等

    详细介绍java并发编程相关知识: 基础知识   并发与并行   Java并发演进历史   Java并发模型   线程模型   存储模型 JVM同步原语 volatile CAS 线程安全   保护“共享数据” 低级并发工具   原子变量   锁...

    并发编程线程安全样例代码.zip

    并发编程、线程安全样例 代码 包含了并发编程的多种业务场景demo测试代码

    java并发编程:线程基础

    本资源致力于向您介绍 Java 并发编程中的线程基础,涵盖了多线程编程的核心概念、线程的创建和管理,以及线程间通信的基本方法。通过深入学习,您将建立扎实的多线程编程基础,能够更好地理解和应用多线程编程。 多...

    高并发和并发编程

    高并发和并发编程并发编程:线程安全+线程封闭+线程调度

    阿里专家级并发编程架构师课程-网盘链接提取码下载 .txt

    课程内容包括了JAVA手写线程池,UC线程池API详解,线程安全根因详解,锁与原子类,分布式锁原理与实现方式,并发编程-AQS等等针对性非常强的JAVA编程开发教程,这其中的内容对JAVA开发技能的拔尖,非常的有帮助。...

    java 并发编程 多线程

    java 并发 编程 多线程 concurrent lock condition executorserice executor java.util.curcurrent.

    java线程与并发编程

    java线程与并发编程是java并发编程的盛典,绝对高清版

    并发编程之线程与线程池.pptx

    并发编程之线程与线程池.pptx 内部培训PPT 多线程 线程池

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第一阶段17讲、Thread API综合实战,编写ThreadService实现暴力结束线程的综合实战.mp4 │ 高并发编程第一阶段18讲、数据同步的引入与Synchronized的简单介绍.mp4 │ 高并发编程第一阶段19讲、结合...

    java高级技术JUC高并发编程教程2021(1.5G)

    java高级技术JUC高并发编程教程2021(1.5G) 〖课程介绍〗: java高级技术JUC高并发编程教程...09-JUC高并发编程-线程间通信-Synchronized实现案例.mp4 10-JUC高并发编程-线程间通信-虚假唤醒问题.mp4 N+ }* P' s3 r&

    Java并发编程和多线程的区别

    总之,多线程是并发编程的一种具体实现方式,用于处理同一程序内的多个线程。而并发编程则更广泛,涵盖了处理多个任务、进程、协程等各种形式的并发执行。 多线程: 多线程是一种计算机编程技术,它涉及到在一个...

    JAVA并发编程实践 .pdf

    书中从并发性和线程安全性的基本概念出发,介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证线程安全的规则,如何将小的线程安全类组合成更大的线程安全类,如何利用线程来提高并发...

    JAVA多线程并发编程

    学习并发编程自己总结的知识,非常实用。JAVA学习并发编程的精华

    JAVA并发编程实战_标签.pdf

    书中从并发性和线程安全性的基本概念出发,介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证线程安全的规则,如何将小的线程安全类组合成更大的线程安全类,如何利用线程来提高...

    Java并发编程实战.rar

    书中从并发性和线程安全性的基本概念出发,介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证线程安全的规则,如何将小的线程安全类组合成更大的线程安全类,如何利用线程来提高...

    java线程与并发编程实践

    java线程与并发实践编程 /美(jeff Friesen) 2017.2 java线程api和并发工具的实用指南

    java并发编程2

    java并发编程pdf文档第二部分:Java并发编程实战.pdf、Java多线程编程核心技术.pdf、实战Java高并发程序设计.pdf

    java并发编程从入门到精通

    《Java并发编程从入门到精通》内容包括并发编程概念,线程,线程安全,线程集合类,线程阀,线程池,Fork/Join,线程、线程池在互联网项目开发的应用,线程监控及线程分析,Android中线程应用。 本书适合Java开发...

    Java并发编程实战

    第2章 线程安全性 2.1 什么是线程安全性 2.2 原子性 2.2.1 竞态条件 2.2.2 示例:延迟初始化中的竞态条件 2.2.3 复合操作 2.3 加锁机制 2.3.1 内置锁 2.3.2 重入 2.4 用锁来保护状态 2.5 活跃性与性能 第...

Global site tag (gtag.js) - Google Analytics