`
- 浏览:
220589 次
- 性别:
- 来自:
广州
-
并发编程系列文章:
初解线程池: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
Java对线程的支持有如一把双刃剑,线程安全性可能是非常复杂的.在没有足够的同步情况下,多个线程中得操作执行顺序是不可预测的,甚至会发生奇怪的结果.而分辨所编写的代码/程序/类是否线程安全或代码运行结果是否一直正确,是每个多线程开发人员必须具备的能力.
对于判断所编写的类是否线程安全,可以参考以下几个方面
1.该对象是否会被多个线程访问修改
假如对象会被多个线程访问,例如各种的Context或Factory,如Hibernate中的SessionFactory.SessionFactory是Session的生产工厂,一般对单库应用全局只需要保持一个SessionFactory,但对其属性的修改则是可以多个线程进行修改,因此若然没有足够的加锁机制,SessionFactory是一个线程不安全的对象.
2.注意静态变量.
请注意变量一词,由于静态变量是属于该类和该类下所有对象共享,可直接通过类名访问/修改,因此在多线程的环境下.可以断言所有对静态变量的修改都会发生线程安全问题.除非静态变量为并发容器,通过委托线程安全容器发布对象.
3.改变对象内部状态的方法调用.
请回看第一点,当一个对象的属性会被多个线程修改时,需要进行同步操作.但并不代表不提供某属性的setter方法就可以万事安心.而真正需要关注的是,哪些内部方法的调用或对外公开的方法调用会导致对象内部属性(状态)的改变.
4.单例
相信大家在学习编程的时候都知道懒加载单例存在线程安全问题.先检查后操作是多线程开发中一个经常大意忽略的问题.因为并行程序共享的变量无时无刻都有可能发生变化,这涉及到数据失效性的问题.而单例由于是全局唯一,所以单例对象会被所有线程所访问,而单例中的属性若然允许进行修改,则会引发线程安全问题.当对象在Spring管理下默认是Singleton,当我们在三层架构开发下.在DAO(Repository)或Service中声明全局变量并对其进行操作,同样会引发线程安全问题.
总结:
不必要的同步会带来性能损耗,判断失误缺少同步系统将失去正确性.判断自己开发的类是否线程安全是每一个多线程开发人员的必修课.
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
在Delphi编程环境中,线程(Thread)是并发执行的程序单元,用于提高应用程序的响应性和效率。在多线程编程中,了解线程的状态至关重要,因为它有助于调试、同步和控制线程的行为。本篇文章将深入探讨如何在Delphi中...
综上所述,易语言提供了丰富的多线程编程功能,包括创建线程、控制线程以及判断线程状态等。通过合理运用这些功能,开发者可以构建出高效、稳定的多线程应用。在实际编程过程中,需要注意线程间的同步和通信,避免...
然而,使用并发编程也存在缺点,例如增加了程序的复杂度,可能导致线程安全问题,以及增加了资源消耗和调度开销。 并发编程的三要素包括原子性、可见性和有序性。原子性是指单个操作是不可再分的最小执行单位;可见...
9. **并发编程的挑战与最佳实践**:书中还讨论了如何调试并发程序、如何设计线程安全的API、如何避免线程安全问题等,为实际开发提供了丰富的经验教训。 10. **并发性能调优**:最后,书中也涵盖了如何评估并发程序...
Java并发编程中的线程中断是一个关键机制,它允许开发者在程序运行过程中显式地请求某个线程停止执行。在本示例中,我们创建了一个名为`PrimeGenerator`的线程,该线程会不断地查找并打印质数。线程中断机制的使用...
6. **线程安全与可变性**:书中讨论了对象的线程安全性,以及如何判断和确保一个类是线程安全的。此外,还讲解了可变性原则,如何设计不可变对象以简化并发编程。 7. **并发编程模式**:书中介绍了一些经典的并发...
- `isAlive()`:判断线程是否处于活动状态。 - `getName()`/`setName()`:获取/设置线程名称。 - `getId()`:获取线程ID。 - `getPriority()`/`setPriority()`:获取/设置线程优先级。 ### Java并发编程高级特性 #...
Java并发编程规则:不可变对象永远是线程安全的 在Java并发编程中,了解不可变对象的概念对于编写线程安全的代码至关重要。不可变对象是指创建后状态不能被修改的对象,这类对象天生就是线程安全的。它们的常量...
此外,书中还介绍了守护线程(Daemon Thread)和用户线程的区别,以及如何设置和判断线程的优先级。 其次,线程池是Java并发编程中的重要工具。线程池可以有效地管理和复用线程,避免频繁创建和销毁线程带来的性能...
在C#中,线程、任务以及并发编程是高级编程技术的重要组成部分,它们允许开发者创建高性能、响应迅速的应用程序。本文将深入探讨这些概念及其在C#中的应用,特别是通过异步委托、线程参数传递以及线程调度的示例进行...
Java并发编程 背景介绍 并发历史 必要性 进程 资源分配的最小单位 线程 CPU调度的最小单位 线程的优势 (1)如果设计正确,多线程程序可以通过提高处理器资源的利用率来提升系统吞吐率 ...
线程安全问题是 Java 并发编程中的一大难点。 代码分析 在给定的代码中,我们可以看到一个线程类 DeprecatedSuspendResume,它实现了 Runnable 接口。这个类中有两个 volatile 变量 firstVal 和 secondVal,它们...
5. **线程安全**:了解什么是线程安全,以及如何判断一个类或方法是否线程安全。线程安全的类如`Atomic`系列、`ConcurrentHashMap`等。 6. **并发集合**:Java提供了线程安全的集合,如`CopyOnWriteArrayList`、`...
Linux多线程编程是操作系统中并发程序设计的一个重要领域,它允许开发者在同一程序中创建多个线程,以实现并行执行,从而提高程序的执行效率和响应能力。Linux下的多线程编程通常基于POSIX线程(pthread)库来实现,...
在UNIX编程中,特别是在多线程环境中,错误输出的处理是一项关键任务,因为它不仅需要提供清晰的错误信息,还需要确保线程安全,防止数据竞争和不确定性。错误输出的线程安全问题主要涉及到系统调用失败的处理以及...
在多线程编程中,线程安全是至关重要的一个概念,它确保了多个线程并发访问同一资源时,不会导致数据的不一致性和错误。在C++中,我们可以使用互斥量(Mutex)来实现线程安全的数据结构,如队列。本主题将详细介绍...
"C#多线程编程实例实战" 本文主要讲解了C#多线程编程实例实战中的线程同步问题,即单个写入程序/多个阅读程序的线程同步问题。在这个同步问题中,我们可以提炼出两个核心要求: 1. 当一个线程正在写入数据时,其他...
并发编程是计算机科学中非常重要的一部分,涉及到多线程编程、线程安全、锁机制等概念。本文档将总结并发编程中的重要知识点,涵盖守护线程和用户线程、线程和进程的区别、多线程中的上下文切换、死锁、活锁和饥饿、...
为了保证线程安全,AQS提供了一个基于CAS(Compare and Set)操作的`compareAndSetTail()`方法来设置队列的`tail`节点。这一机制确保了队列的操作是原子性的,从而避免了数据竞争和不一致的问题。 综上所述,AQS...