`

什么是线程安全?

阅读更多

什么是线程安全?

如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。

  或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。

  线程安全问题都是由全局变量及静态变量引起的。

  若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全。

举例

比如一个 ArrayList 类,在添加一个元素的时候,它可能会有两步来完成:1. 在 Items[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。这就是“线程不安全”了。

分享到:
评论
1 楼 txy821 2010-04-07  
不用考虑同步的问题

相关推荐

    c# 线程安全队列的用法原理及使用示例

    什么是线程安全? 答:线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等...

    【并发】为什么HashMap是线程不安全的?

    经常会看到说HashMap是线程不安全的,ConcurrentHashMap是线程安全的等等说法,不禁有个疑问,什么是线程安全?什么样的类是线程安全的? 1.什么是线程安全性(what) 线程安全定义,最核心是正确性, 正确性:多个...

    关于如何解决HashMap线程安全问题的介绍

    但是需要注意,虽然这个方法可以保证基本的线程安全,但迭代仍然是非线程安全的,即不能在遍历过程中修改Map。 2. 使用ConcurrentHashMap:Java从1.5版本开始引入了ConcurrentHashMap,它是线程安全且高并发性能的...

    servlet线程安全问题

    Servlet 线程安全问题 Servlet 线程安全问题是指在使用 Servlet 编程时,如果不注意多线程安全性问题,可能会导致难以发现的错误。Servlet/JSP 技术由于其多线程运行而具有很高的执行效率,但这也意味着需要非常...

    mysql是线程不安全的,mysql不是线程安全的,多线程共用同一个mysql连接是会崩溃的.所以同样QT的QSqlDatabase也是线程不安全的,QS会崩溃

    mysql是线程不安全的,mysql不是线程安全的,多线程共用同一个mysql连接是会崩溃的 QT的QSqlDatabase是基于mysql的,所以一样是线程不安全的 现讲明mysql为什么是线程不安全的,以及在多线程环境下如何使用mysql,...

    Struts线程安全

    什么是线程安全? 在多线程环境中能够正确执行且不会导致数据错误或程序故障的代码称为线程安全的代码。如果不确保线程安全,可能会导致数据损坏、死锁、竞态条件等问题。 #### 2. 如何编写线程安全的代码? ...

    Java线程面试题Top50[参照].pdf

    Java 线程面试题 Top 50 Java 线程是操作系统能够进行...十、什么是线程安全? * 线程安全是指在多线程环境下,某个类或方法能够正确地工作 * Vector 是一个线程安全的类 * 线程安全是 Java 编程中非常重要的一方面

    200道Java面试常见题目.pdf

    * 什么是线程安全?Java中如何实现线程安全? * 什么是线程池?Java中如何实现线程池? * 什么是CAS?Java中如何使用CAS实现线程安全? * 什么是同步锁?Java中有哪些常见的同步锁实现方式? * 什么是原子类?Java中...

    java面试题.pdf

    10道Java面试题及详细解答 ...5. Java中什么是线程安全? 6. Java中抽象类和接口的区别是什么? 7. Java中什么是异常? 8. Java中如何防止对象的clone? 9. Java中什么是泛型? 10. Java中如何实现单例模式?

    40道常问的Java多线程面试题!.zip

    13. **什么是线程安全?** 线程安全的类或方法在多线程环境中,无论调用顺序如何,都能保证正确性。 14. **Java中如何实现线程池?** 使用ExecutorService、ThreadPoolExecutor和Executors类。 15. **什么是线程...

    Android(Java)

    什么是线程安全? 线程安全是指在多线程环境下,程序能够正确地执行,不会出现不安全的行为。线程安全的主要问题在于资源的共享和同步。多个线程共享同一个资源时,可能会出现脏读、脏写等问题。因此,需要采取一定...

    【面试资料】-(机构内训资料)java面试题_多线程(68题).zip

    - **什么是线程安全?** 多线程环境下,类的行为正确且结果一致。 - **如何实现线程安全?** 使用线程安全的数据结构、同步机制、原子操作或不可变对象。 以上只是部分知识点的概述,实际的面试题可能涉及到更...

    C#多线程List的非线程安全性

    本文将深入探讨在多线程环境中使用List时遇到的非线程安全问题,并提供相应的解决方案和最佳实践。 List是.NET框架中常用的一个动态数组,它提供了方便的增删改查操作。然而,List并未设计为线程安全的容器,这意味...

    Java多线程经典面试题68问

    5. **什么是线程安全?** 当多个线程访问一个对象时,如果不用考虑线程同步问题,那么这个对象就是线程安全的。 6. **Java中synchronized关键字的作用是什么?** synchronized用于控制对共享资源的并发访问,保证...

    CVI 线程锁、线程安全变量实例

    在计算机编程领域,尤其是涉及到实时系统和并发编程时,线程锁和线程安全变量是至关重要的概念。LabWindows/CVI是一种流行的交互式C开发环境,特别适合于开发科学和工程应用。本实例将深入探讨如何在LabWindows/CVI...

    Java高级程序员面试题,非基础并发为主

    9. 什么是线程安全?Servlet 是线程安全吗?:线程安全是指一个对象或方法可以在多线程环境中安全地使用;Servlet 是线程安全的,因为它使用了synchronized关键字来保护其内部状态。 线程通信 10. 什么是 Callable...

    C++日志库-线程安全

    首先,我们需要理解什么是线程安全。线程安全是指在多线程环境下,当多个线程同时访问同一资源时,该资源仍能保持正确的行为。在日志库中,线程安全通常涉及到对日志文件的并发写入和日志级别的同步控制。 在`Log....

    面试题全集(周瑜).pdf

    * 什么是线程安全? * 什么是守护线程? * ThreadLocal的底层原理 * 并发、并行、串行之间的区别 * Java死锁如何避免? * 线程池的底层工作原理 * ReentrantLock中的公平锁和非公平锁的底层实现 * CountDownLatch和...

Global site tag (gtag.js) - Google Analytics