网络编程基础知识之线程安全

145 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

网络编程基础知识之线程安全

  线程安全是多线程编程中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。线程安全性的分类方法包括不可变、线程安全、有条件线程安全等。这种分类系统的核心是调用者是否可以或者必须用外部同步包围操作线程安全具有多线程共享变量或方法可以在多线程的环境下被安全有效地访问的意义。这说明了两方面的问题:(1)可以从多个线程中调用,无需调用方有任何操作。(2)可以同时被多个线程调用,无需线程之间不必要的交互。

  通俗地说,就是多线程访问时,采用了加锁机制,当一个线程访问该公共类的数据时,进行保护。其他线程不能进行访问,直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。

线程不安全:通俗地说,就是在多个线程访问时,不提供数据保护,有可能出现多个线程先后访问更改数据所得到的数据是脏数据。

  在实际多线程编程过程中,也可以说当一个类或者程序所提供的接口对线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是我们无需考虑同步问题这样我们也可以说是线程安全的。

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

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

线程安全性常见类别

主要有:不可变、线程安全、有条件的线程安全。

不可变

  不可变的对象一定是线程安全的,并且永远也不需要额外的同步。因为一个不可变的对象只要构建正确,其外部可见状态永远也不会改变,永远也不会看到它处于不一致的状态

线程安全

  线程安全的对象具有在上面“线程安全”一节中描述的属性——由类的规格说明所规定的约束在对象被多个线程访问时仍然有效,不管运行时环境如何排线程对都不需要任何额外的同步

有条件的线程安全

  有条件的线程安全类对于单独的操作可以是线程安全的,但是某些操作序列可能需要外部同步。有条件的线程安全最常见的例子是遍历由HashTable或者Vector返回的迭代器——由这些类返回的迭代器假定在迭代器进行遍历的时候底层集合不会发生改变。为了保证其他线程不会在遍历的时候改变集合,进行迭代的线程应该确保它是独占性地访问集合以实现遍历的完整性。通常,独占性的访问是由对锁的同步保证的并且类的文档应当说明是哪类锁

版权声明:本文为CSDN博主「ufgnix0802」的原创文章:
原文链接:(blog.csdn.net/qq135595696…)