`
- 浏览:
220190 次
- 性别:
- 来自:
广州
-
并发编程系列文章:
初解线程池: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时仍然需要同步操作.
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
本文将深入探讨"Java并发编程-线程安全与基础构建模块"这一主题,旨在帮助开发者理解如何有效地处理并发问题,提高程序性能和稳定性。 首先,线程安全是并发编程中的核心概念,指的是多个线程访问同一资源时,无论...
本课程将结合大量图示及代码演示,带你掌握多线程并发编程(线程安全,线程调度,线程封闭,同步容器等)与高并发处理思路与手段(扩容,缓存,队列,拆分等),构建完整的并发与高并发知识体系,胜任实际开发中并发...
在并发编程中,线程安全是一个至关重要的概念,它涉及到多线程环境下程序的正确性和稳定性。本示例代码库提供了多种并发编程的业务场景,帮助开发者深入理解如何在Java等编程语言中处理线程安全问题。以下是这些场景...
本文将全面介绍Java并发编程的基础知识、JVM同步原语、线程安全、低级并发工具、线程安全容器、高级线程协作工具以及Executor服务。 1. **基础知识** - **并发与并行**:并发是指多个任务在同一时间段内交替执行,...
线程安全的数据结构,如ConcurrentHashMap、ConcurrentLinkedQueue等,是Java并发编程的重要组成部分。它们内部实现了线程安全的更新策略,能够在高并发环境下保证数据一致性。 异常处理在多线程编程中同样重要。...
首先,Java并发编程的核心在于管理线程的并发执行。线程并发的使用可以显著提升程序处理能力,例如在服务器端处理大量用户请求时,如果每个请求都由单独的线程处理,那么处理速度将大大提高。但同时,多线程并发也会...
│ 高并发编程第一阶段17讲、Thread API综合实战,编写ThreadService实现暴力结束线程的综合实战.mp4 │ 高并发编程第一阶段18讲、数据同步的引入与Synchronized的简单介绍.mp4 │ 高并发编程第一阶段19讲、结合...
通过学习《Java并发编程实战》的源码,你可以更直观地了解这些概念如何在实际代码中实现,从而提升你的并发编程能力。在IDE中运行这些示例,可以加深对并发原理的理解,同时也能锻炼解决问题的能力。记住,实践是...
- **原子变量**:`std::atomic`提供了一种轻量级的同步机制,可以在不使用锁的情况下实现线程安全的数据访问。 #### 四、同步并发操作 第四章讨论了多种同步机制,这些机制可以帮助开发者更好地控制线程间的执行...
Java并发编程中的线程基础是理解多线程编程的关键,它涵盖了从线程的创建到管理,再到线程间通信的全过程。多线程编程在处理高性能和高响应性的应用程序时至关重要,因为它允许程序在单个进程中同时执行多个任务,...
在Java并发编程中,线程安全是一个至关重要的概念,它涉及到多线程环境下对共享数据的正确管理和访问。线程安全意味着当多个线程同时访问一个对象或数据时,对象的状态能够保持一致性和完整性,不会因为并发导致数据...
10. **线程安全的数据结构**:`Concurrent`系列类(如`ConcurrentQueue`, `ConcurrentStack`, `ConcurrentDictionary`等)提供了线程安全的集合,可以在多线程环境下安全地读写数据。 11. **死锁与活锁**:死锁是两...
书中还可能涵盖无锁编程的概念和实践,这涉及到Java的volatile关键字和final关键字,以及这些特性如何帮助构建线程安全的代码。 在并发控制方面,《Java并发编程实战》可能会探讨不同类型的锁,如互斥锁(Mutex)、...
- **线程安全的集合类** 如`ConcurrentHashMap`、`CopyOnWriteArrayList`等,它们在内部实现了并发控制,保证了多线程环境下的安全操作。 - **`BlockingQueue`** 是一种线程安全的队列,常用于线程间的通信和协作...
原子操作是C++并发编程中的重要特性,它们为开发者提供了一种高效、灵活且线程安全的方法来处理并发问题。 随着多核处理器的普及,多线程编程在C++中变得越来越重要。在多线程环境中,保证数据的一致性和线程安全是...
3. **并发集合**:书中会深入分析并发集合类的设计和使用,如ConcurrentHashMap如何实现线程安全的读写操作,以及CopyOnWriteArrayList在迭代时的线程安全性。 4. **线程池**:Java的Executor框架是管理线程的重要...
- **确保线程安全**: 在Java并发编程中,确保线程安全是至关重要的。通常有三种方法来实现这一点: - 使用`synchronized`关键字:这是最基本的线程同步方式,可以确保同一时间只有一个线程能够访问特定的代码块或...
并发集合是Java并发编程中的重要组成部分,如`ConcurrentHashMap`, `CopyOnWriteArrayList`, `ConcurrentLinkedQueue`等,它们设计为线程安全,能够在并发环境中高效地工作。书中的章节可能会详细解释这些集合的设计...
书中将介绍如何使用std::atomic库来构建无锁数据结构,实现高效且线程安全的数据访问。这不仅提高了程序的并发性能,还降低了因锁竞争导致的性能下降。 未来(futures)和承诺(promises)是C++11中引入的高级并发...