1、什么是线程安全(thread safe)?
一个类要成为线程安全的类,就是在该类被多个线程访问时,不管运行环境中执行这些线程有什么样的时序安排或者交错,它仍然执行正确行为,并且在调用的代码中没有任何额外的同步。
2、什么时候考虑线程安全问题?
当一个类的实例为singleton的时候,你就要考虑该实例在调用的时候是否是线程安全的。
最熟悉的例子就是servlet, 每个servlet在servlet engineer中只有一个实例。除非它实现SingleThreaded接口。所以我们一般要求在servlet中不要定义成员变量,以避免线程不安全。
是不是凡是singleton的对象都不是线程安全的呢?答案是No。准确的表达应该是:只有该类中定义了有状态的成员时该类才是线程不安全的。
举个例子:
public class A{
String id ;
public void process(){
print(id);
...
}
}
id是一个有状态的变量。什么是有状态,就是指每次调用该类的时候如果该id值可能存在不同的值,那么这个id就是有状态的。
我们再看看下面的例子。
public class B{
public void process(){
int i;
int j;
println(i*y);
}
}
这个class B在单实例的情况下就是线程安全的。原因是:该类没有有状态的成员。i,j是局部变量,某个线程都会有自己的stack保存这些局部变量。所以对于不同线程来说,这些变量是相互不影响的。
对于存在线程不安全的类,如何避免出现线程安全问题呢?
1、采用synchronized同步。缺点就是存在堵塞问题。
2、使用ThreadLocal(实际上就是一个HashMap),这样不同的线程维护自己的对象,线程之间相互不干扰。
总结:
1、我们一般要求商业逻辑的BO为线程安全的类,这样就可以将该BO创建成一个单实例的对象,提高访问的效率。为了使BO为线程安全的对象,我们所要做的很简单,就是该类中不要有与状态相关的成员变量。
分享到:
相关推荐
但是需要注意,虽然这个方法可以保证基本的线程安全,但迭代仍然是非线程安全的,即不能在遍历过程中修改Map。 2. 使用ConcurrentHashMap:Java从1.5版本开始引入了ConcurrentHashMap,它是线程安全且高并发性能的...
在多线程环境下,线程安全的单例模式尤为重要,因为如果不正确实现,可能会导致多个线程同时创建多个实例,违反了单例模式的基本原则。 在Java中,单例模式通常有以下几种实现方式: 1. 饿汉式(静态常量): ...
在Java编程中,多线程安全集合是程序员在并发环境下处理数据共享时必须考虑的关键概念。这些集合确保了在多个线程访问时的数据一致性、完整性和安全性,避免了竞态条件、死锁和其他并发问题。Java提供了一系列的线程...
在C#编程中,线程安全是多线程应用程序中至关重要的一个方面,尤其是在处理共享资源如文本日志文件时。本主题将深入探讨如何在C#中创建一个高效的线程安全日志类,用于在多线程环境中安全地写入txt日志。 首先,...
在处理串口通信时,线程安全是一个关键的概念,特别是当程序需要同时处理多个任务或者从外部设备(如串口)持续接收数据时。本主题将深入探讨如何在VS2013中使用C#实现线程安全的串口数据接收。 串口通信是计算机...
然而,并非所有集合类都是线程安全的,这在多线程环境中可能导致数据不一致或者运行时异常。线程安全指的是一个对象在多线程环境下可以被正确地访问和修改,而不会出现竞态条件或死锁等问题。 线程不安全的集合类...
本知识点将探讨如何在Winform应用中使用C#实现委托、进度条赋值以及线程安全的操作,这些都是创建高效、用户友好型程序的关键元素。 1. **委托(Delegate)**: 委托在C#中是一种类型,它代表一个方法的引用。它可以...
### JDK中线程安全的集合类详解 #### 1. 引言 在Java开发过程中,随着并发编程的日益普及,对于数据结构的选择也提出了更高的要求。非线程安全的数据结构如`HashMap`在高并发场景下可能会出现数据不一致等问题,这...
5. **解决策略**:实现线程安全的方法包括但不限于使用线程局部变量(ThreadLocal)、synchronized关键字、ReentrantLock等同步机制,以及避免在Servlet或Action中使用实例变量,转而使用局部变量或依赖注入等策略。...
### 线程安全函数详解 #### 一、线程安全与非线程安全函数的概念 在并发编程中,线程安全函数是一个重要的概念。线程安全指的是在多线程环境中,函数能够处理同时发生的多个请求,而不至于导致数据混乱或程序错误...
在Java编程中,线程安全性和不安全性是并发编程中非常关键的概念。线程安全意味着在多线程环境中,一个类或方法可以被正确地访问和修改,而不会导致数据不一致或错误。线程不安全则表示在多线程环境下,如果不采取...
Java中的线程安全是多线程编程中一个重要的概念,主要涉及到并发访问数据结构时的正确性和一致性。线程安全的实现方式多种多样,包括使用synchronized关键字、原子类、阻塞队列以及特定的并发集合类等。下面将详细...
在Java编程中,多线程和线程安全是至关重要的概念,特别是在开发高效、响应迅速的应用程序时。本文将深入探讨如何在Java中利用多线程实现基于HTTP协议的断点续传功能,并关注线程安全问题。 首先,让我们了解多线程...
在java的庞大体系中,其实有很多不错的小工具,也就是我们平常说的:轮子。 如果在我们的日常工作当中,能够将...这时,可以用Collections的synchronizedxxx方法,将这些线程不安全的集合,直接转换成线程安全集合。
### Struts线程安全概述 在探讨Struts框架下的线程安全问题之前,我们需要了解一些基础知识。Struts是一个用于构建企业级Java Web应用程序的开源框架,它基于MVC(Model-View-Controller)设计模式。在典型的Web...
.NET Framework 4 提供了一组线程安全的集合类,这些类位于 `System.Collections.Concurrent` 命名空间中,旨在提高多线程环境下的性能和安全性。这些集合类允许开发者在无需额外同步代码的情况下安全地进行并发读写...
Java中的线程安全性是并发编程中的关键概念,它关乎到多线程环境下程序的稳定性和正确性。线程安全的类意味着在多个线程并行访问时,它们的行为仍然是正确和一致的,无需额外的同步措施。然而,线程安全并不简单地...
### 深入研究Servlet线程安全性问题 #### 一、引言 Servlet技术作为Java Web开发中的核心组件之一,因其高效性和灵活性被广泛应用于Web应用程序的开发中。Servlet能够处理HTTP请求,并产生相应的响应。它的一个...