只有在单例并发的情况下才会出现线程安全问题,引起问题的主要原因就在于对象的资源共享(如实例变量等),不过局部变量是线程安全的。因此在程序设计的时候尽量不要用实例变量。产生这样原因在于java的内存分配机制,实例变量是存放在堆内存中的所有线程共享,而每个线程也都有自己的线程盏,局部变量存放在线程盏中,各线程独享。
简要的说在并发的时候,servlet与struts1都是单例多线的模式,一旦声明的有实例变量,就会引起线程安全问题。struts2是多例单线模式(需要配置)无所谓线程安全。spring中server层对象一般都是无状态的,因此运用单例亦不会出现线程安全问题,如果对象存在状态就需要考虑并发下的线程安全问题。
下面简单的介绍下ThreadLocal:
ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread
,而是thread local variable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。
线程局部变量(ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一
个变量值的副本,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。
从线程的角度看,就好像每一个线程都完全拥有该变量。
个人简要理解为线程的单例。和并发多线程并没有直接的关系,关注的领域也是不同的!不要将ThreadLocal和多线并发混淆。
分享到:
相关推荐
servlet线程安全问题servlet线程安全问题
什么是线程安全? 答:线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等...
包括:Linux64位(非线程安全) swoole_loader56.so、swoole_loader70.so、swoole_loader71.so、swoole_loader72.so、swoole_loader73.so、swoole_loader74.so。 Linux64位(线程安全) swoole_loader56_zts.so、swoole_...
内容概要:文章内容从原子性、可见性、有序性三个方面介绍C++线程安全问题的原因。通过原子操作、线程同步如互斥锁、读写锁、条件变量、信号量等方法解决C++线程安全问题。同时介绍了线程安全的单例,饿汉模式和懒汉...
你还在用synchronized?线程安全相关知识深入剖析
C++线程安全日志库-Win32接口实现,博客讲解:https://www.cnblogs.com/swarmbees/ ->C++线程安全日志库-Win32接口实现
该文件中实例说明了如何在Labwindows/cvi中使用线程锁和线程安全变量进行多线程程序设计
众所周知,在普通的非线程安全队列有两种实现方式: 1.使用数组实现的循环队列。 2.使用链表实现的队列。 先看看两种方式的优劣: .Net Farmework中的普通队列Queue的实现使用了第一种方式,缺点是当队列空间不足会...
mysql是线程不安全的,mysql不是线程安全的,多线程共用同一个mysql连接是会崩溃的 QT的QSqlDatabase是基于mysql的,所以一样是线程不安全的 现讲明mysql为什么是线程不安全的,以及在多线程环境下如何使用mysql,...
c++ stl线程安全 c++ stl线程安全 c++ stl线程安全
servlet与Struts action线程安全问题分析
【C++ 语言】线程安全队列 ( 条件变量 | 线程调度 ) : https://hanshuliang.blog.csdn.net/article/details/102851323 下载完项目后 , 使用 Visual Studio 打开 , 注意需要配置 POSIX 线程库 ( 参考以下博客配置...
应用在多线程模式下 线程安全 写txt日志封装应用 调用示例
下面小编就为大家分享一篇浅谈C#跨线程调用窗体控件(比如TextBox)引发的线程安全问题,具有很好的参考价值,希望对大家有所帮助
原创手操,操作系统课设,线程安全的双向链表,VC6.0,无须配置,可运行
申明:不是原创,不是原创,只是转载。 这是一个来自网上的例子 ...用于测试QList的线程安全性,因原作者只给出源代码,没有给出测试结果,这里生成一个QT工程,打开即可编译,内部有ReadME.txt,简要说明
线程安全的单例模式 线程安全的单例模式 线程安全的单例模式
hiredis的c++封装, 线程安全, 提供对键值对、队列、散列、集合结构的读写