`
chriszeng87
  • 浏览: 738663 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

线程安全的概念

    博客分类:
  • Java
阅读更多

什么是线程安全?

 

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

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

 

举例

 

比如一个 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。这就是“线程不安全”了。

 

线程安全性

 

类要成为线程安全的,首先必须在单线程环境中有正确的行为。如果一个类实现正确(这是说它符合规格说明的另一种方式),那么没有一种对这个类的对象的操作序列(读或者写公共字段以及调用公共方法)可以让对象处于无效状态,观察到对象处于无效状态、或者违反类的任何不可变量、前置条件或者后置条件的情况。

  此外,一个类要成为线程安全的,在被多个线程访问时,不管运行时环境执行这些线程有什么样的时序安排或者交错,它必须仍然有如上所述的正确行为,并且在调用的代码中没有任何额外的同步。其效果就是,在所有线程看来,对于线程安全对象的操作是以固定的、全局一致的顺序发生的。

  正确性与线程安全性之间的关系非常类似于在描述 ACID(原子性、一致性、独立性和持久性)事务时使用的一致性与独立性之间的关系:从特定线程的角度看,由不同线程所执行的对象操作是先后(虽然顺序不定)而不是并行执行的。




 

 

 

 

分享到:
评论

相关推荐

    Java线程安全基础概念解析

    Java线程安全基础概念解析 ...Java线程安全基础概念解析是Java编程语言中一个非常重要的概念,开发者需要充分了解线程安全的定义、Java语言中的线程安全和线程安全的实现方法,以便编写更加高效、可靠的多线程程序。

    Java多线程与线程安全实践-基于Http协议的断点续传.rar

    本资源包“Java多线程与线程安全实践-基于Http协议的断点续传....通过这个实践项目,学生不仅能够加深对Java多线程和线程安全概念的理解,还能提升解决实际问题的能力,为未来的软件开发工作打下坚实的基础。重新回答||

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

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

    JAVA多线程与线程安全实践-基于Http协议的断点续传【毕业论文】.zip

    综上所述,这篇毕业论文通过结合Java的多线程、线程安全概念和HTTP协议的断点续传功能,展示了如何设计和实现一个高效的文件下载系统。这样的系统不仅能够提高用户体验,减少网络资源浪费,而且展示了对并发编程和...

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

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

    操作系统原理线程概念与应用 操作系统原理线程概念与应用

    本文将深入探讨操作系统原理中的线程概念及其应用。 线程的概念: 线程是进程中的一个执行路径,每个线程都有自己的程序计数器、寄存器集合以及栈空间,但它们共享同一块内存空间,包括全局变量、静态变量等。这种...

    C++日志库-线程安全

    本文将详细讨论如何在C++中实现一个基于Win32接口的线程安全日志库,并关注其核心概念和技术。 首先,我们需要理解什么是线程安全。线程安全是指在多线程环境下,当多个线程同时访问同一资源时,该资源仍能保持正确...

    java线程安全测试

    Java线程安全是多线程编程中的一个关键概念,它涉及到多个线程访问共享资源时可能出现的问题。在Java中,线程安全问题通常与并发、内存模型和可见性有关。Java内存模型(JMM)定义了如何在多线程环境下共享数据的...

    局部变量线程安全测试

    在编程领域,线程安全是多线程编程中的一个重要概念,尤其在Java、C++等支持并发编程的语言中。线程安全通常指的是当多个线程访问一个对象时,如果对象的状态始终保持一致,那么我们就说这个对象是线程安全的。这里...

    Java多线程安全集合

    在Java编程中,多线程安全集合是程序员在并发环境下处理数据共享时必须考虑的关键概念。这些集合确保了在多个线程访问时的数据一致性、完整性和安全性,避免了竞态条件、死锁和其他并发问题。Java提供了一系列的线程...

    java线程安全总结.doc

    Java线程安全是多线程编程中的一个关键概念,它涉及到在并发环境下如何正确地管理共享资源,确保程序的正确性和一致性。以下是对Java线程安全的深入总结: ### 一、线程安全的定义 线程安全是指当多个线程访问同一...

    操作系统课设-线程安全的双向链表

    线程安全是多线程编程中的关键概念,意味着多个线程可以同时访问同一资源而不会导致数据错误或意外的行为。在双向链表中实现线程安全,通常需要使用同步原语来保护对链表的操作。在Windows系统中,如VC6.0环境,我们...

    易语言线程安全之原子锁与读写锁

    在IT行业中,线程安全是多线程编程中的一个重要概念,确保多个线程并发执行时,数据的正确性和完整性不会受到影响。线程安全通常通过同步机制来实现,其中包括原子操作和锁机制。本文将深入探讨易语言中的原子锁与...

    C# 高效线程安全,解决多线程写txt日志类

    首先,我们需要理解线程安全的概念。线程安全意味着当多个线程访问同一段代码时,该代码能正确处理并发操作,不会出现数据不一致或竞态条件等问题。在多线程写入txt日志时,如果没有正确的同步机制,可能会导致日志...

    操作系统课设-线程安全的双链表

    首先,我们要理解线程安全的核心概念。在多线程环境中,当一个资源或操作在被多个线程同时访问时,如果能够确保其行为正确无误,那么我们称这个资源或操作是线程安全的。对于线程安全的双链表,我们需要关注的是链表...

    线程安全测试类

    在Java编程语言中,线程安全是多线程环境下程序正确性和稳定性的重要概念。线程安全测试类的设计是为了确保在并发环境中,多个线程访问共享资源时不会导致数据的不一致或异常行为。本测试主要关注`synchronized`...

    unix_linux线程安全问题

    然而,只有深入理解线程安全的概念,并且在设计和实现时谨慎处理共享资源和线程交互,才能编写出高效、稳定且安全的多线程程序。开发人员应当时刻铭记线程安全的重要性,并将其作为设计多线程程序时的首要考虑因素。

    C++实现线程安全队列

    在多线程编程中,线程安全是至关重要的一个概念,它确保了多个线程并发访问同一资源时,不会导致数据的不一致性和错误。在C++中,我们可以使用互斥量(Mutex)来实现线程安全的数据结构,如队列。本主题将详细介绍...

    hiredis的c++封装, 线程安全

    线程安全是多线程编程中的一个重要概念,它意味着多个线程并发访问同一资源时,不会导致数据不一致或引发异常。在C++中实现hiredis的线程安全,通常需要采用以下策略: 1. **互斥锁(Mutex)**:在执行Redis命令时...

    c#线程安全的源代码示例

    在C#编程中,线程安全是一个至关重要的概念,特别是在多线程环境下,它涉及到多个线程同时访问共享资源时的正确性和一致性。本项目提供了一系列的源代码示例,帮助开发者理解和实现线程安全。 首先,理解线程安全的...

Global site tag (gtag.js) - Google Analytics