线程安全是针对多线程来讲的:
如果所使用的公用变量在多线程下没有被保护机制时,变量结果会和理论值不一致,这就是线程不安全;
相反公用变量在保护机制下工作,就不会出现“随机”变化,这时叫线程安全。
线程安全:
在多线程中使用时,不用自己做同步处理;
线程不安全:
在多线程中使用时,必须做线程同步,不然会有未知后果。
线程的工作原理:
JVM有一个main memory,而每个线程有自己的working memory,一个线程对一个variable进行操作时,都要在自己的working memory里面建立一个copy,操作完之后再写入main memory。多个线程同时操作同一个variable,就可能会出现不可预知的结果。
可以用synchronized来解决
Synchronized的关键是建立一个monitor,这个monitor可以是要修改的variable也可以其他你认为合适的object比如method,然后通过给这个monitor加锁来实现线程安全,每个线程在获得这个锁之后,要执行完load到working memory -> use&assign -> store到main memory的过程,才会释放它得到的锁。这样就实现了所谓的线程安全。
例如:
vector线程安全 ArrayList非线程安全,但却节约系统性能:
一个ArrayList类,在添加一个元素的时候,它可能会有两步来完成:
1、在item[size]的位置放此元素;
2、增大size的值
在单线程运行的情况下,如果size=0,添加一个元素后,此元素在位置0,而size=1;
而如果在多线程情况下,比如有两个线程,线程A先将元素存放在位置0。但是此时CPU调度线程A暂停,线程B得到运行的机会。线程B也向此ArrayList添加元素,因为此时Size仍然等于0(注意哦,我们假设的是添加一个元素是要两个步骤,而线程A仅仅完成了步骤1),所以此时线程B也将元素存放在位置0。然后线程A和线程B都继续运行,都增加Size的值。
那好,现在我们来看看ArrayList的情况,元素实际上只有一个,存放在位置0,而size却等于2,这就是"线程不安全"了
分享到:
相关推荐
servlet线程安全问题servlet线程安全问题
mysql是线程不安全的,mysql不是线程安全的,多线程共用同一个mysql连接是会崩溃的 QT的QSqlDatabase是基于mysql的,所以一样是线程不安全的 现讲明mysql为什么是线程不安全的,以及在多线程环境下如何使用mysql,...
HashMap为什么是线程不安全的?如何解决HashMap的线程不安全问题?
最近在做多线程方面的工作,工作中发现多线程中很多坑,这里就有一个List添加对象的误区,解释了List容量扩展后内存开辟导致的线程不安全性的问题,这里做个分享跟大家讲讲这个坑是怎么形成的怎么样避免。
什么是线程安全? 答:线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等...
你还在用synchronized?线程安全相关知识深入剖析
c++ stl线程安全 c++ stl线程安全 c++ stl线程安全
Python应用实战:python多线程-多线程安全问题&lock与rlock.zip
该文件中实例说明了如何在Labwindows/cvi中使用线程锁和线程安全变量进行多线程程序设计
C++线程安全日志库-Win32接口实现,博客讲解:https://www.cnblogs.com/swarmbees/ ->C++线程安全日志库-Win32接口实现
操作系统c++编程实现安全型双向链表,线程的创建,利用线程对链表进行增删改操作,并检验结果是否正确
线程安全的单例模式 线程安全的单例模式 线程安全的单例模式
申明:不是原创,不是原创,只是转载。 这是一个来自网上的例子 ...用于测试QList的线程安全性,因原作者只给出源代码,没有给出测试结果,这里生成一个QT工程,打开即可编译,内部有ReadME.txt,简要说明
Java中懒汉单例设计模式线程安全测试,单例设计模式的测试
内容概要:文章内容从原子性、可见性、有序性三个方面介绍C++线程安全问题的原因。通过原子操作、线程同步如互斥锁、读写锁、条件变量、信号量等方法解决C++线程安全问题。同时介绍了线程安全的单例,饿汉模式和懒汉...
栈的线程安全问题 的解决代码 push pop synchronized THread
Action是否线程安全 Action是否线程安全 Action是否线程安全
包括: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_...
servlet与Struts action线程安全问题分析
下面小编就为大家分享一篇浅谈C#跨线程调用窗体控件(比如TextBox)引发的线程安全问题,具有很好的参考价值,希望对大家有所帮助