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为线程安全的对象,我们所要做的很简单,就是该类中不要有与状态相关的成员变量。
分享到:
相关推荐
深入研究Servlet线程安全性问题...
C#线程安全的事件类研究报告,附有详细源码以及分析批注,内容翔实,帮助.NET编程人员进一步深入理解.NET框架中的事件工作原理和不足。
比较深刻地论述了Servlet线程安全性问题
在Java程序中,JVM负责线程的调度。线程调度是值按照特定的机制为多个线程分配CPU的使用权。 调度的模式有两种:分时调度和抢占式调度。分时调度是所有线程轮流获得CPU使用权,并平均分配每个线程占用CPU的时间;...
通过本毕业设计题目的研究和实践,学生可以深入理解Java多线程技术和线程安全机制,掌握Http协议的基本原理和应用方法,提高软件设计和开发能力。同时,学生还可以了解断点续传技术在实际应用中的重要性,以及如何...
它旨在提供一个全面、深入的学习和研究工具,适用于本科课程设计、毕业设计以及任何希望深入学习Java编程的学习者。 详细内容: 源代码——提供了一套完整、经过良好注释的Java源代码,实现了多线程与线程安全实践...
NULL 博文链接:https://jackyin5918.iteye.com/blog/2021121
本篇文章提供了20道高难度的Java多...通过研究和解答这些高难度问题,您将提升自己的并发编程能力,展现出对Java多线程编程的深刻理解和掌握。不仅可以帮助您在面试中脱颖而出,更能够在实际项目开发中应对并发挑战。
本文主要从线程的基础用法,CLR线程池当中工作者线程与I/O线程的开发,并行操作PLINQ等多个方面介绍多线程的开发。 其中委托的BeginInvoke方法以及回调函数最为常用。 而 I/O线程可能容易遭到大家的忽略,其实在开发...
真正的多线程,支持http,ftp等协议,且可断点续传下载的...内附控件的详细中文使用说明,还有很多代理同步异步下载模式,我想其它程序员都可深入研究。包中有我做好现成的VB6源代码例子,可以直接拿来使用。绝对超值。
多线程的总结,对GCD有深入探讨,中文标注,包你了解GCD,还有其它多线程的方法
这意味着读者可以深入研究代码,了解每个功能的实现方式,学会如何构建一个高性能的FTP服务器。 多线程设计: 该FTP服务器采用多线程设计,以实现更好的性能和并发处理。通过研究这份源代码,读者将学会如何使用Java...
讲座内容:Windows的启动是一个复杂的过程,从加载器(NTLDR 或WinLoad)开始工作到Windows子系统准备就绪,中间经历了若干个复杂的步骤,包括内核和执行体的初始化,创建系统进程和线程,对象管理器初始化基本对象...
一个可以在JavaScript中应用多线程的库:Concurrent.Thread,如果你想更深入的了解,推荐您去看the tutorial。它提供有关Concurrent.Thread用法的更多内容,并列出了可供高级用户使用的文档,是最适合起步的材料。 ...
加州伯克利的Edward A. Lee发表的的一篇重量级paper,内容基本说明了多线程实现中面临的问题。对于希望深入研究多线程编程的程序员来说这是一份不可多得的资料。
深入研究Windows内部原理系列之九:Windows的安全机制和实现 讲师信息:张瞰 2007年02月06日 14:00-15:30 Level: 400 Windows如何从操作系统层面保障所有程序的安全?访问控制列表,令牌、系统帐号、SAM数据库、...
本资源提供了一个全面且深入的计算机专业毕业设计项目,主题为“基于ASP.NET的多线程TCP端口扫描程序的设计与实现”。该项目通过结合ASP.NET技术和多线程编程,实现了对目标系统的TCP端口进行高效、准确的扫描。 **...
在这个系列课程中,来自微软的权威技术专家将向您解释Windows操作系统的内部工作原理,从系统架构的大局观出发,逐步展示进程、线程、安全机制、内存管理和存储管理等子系统的工作方式。通过对底层原理的揭示,使您...