龙空技术网

线程安全:当我们的服务器后台同时运行多个进程时...

网盾网络安全培训 113

前言:

如今看官们对“线程安全集合可以在多线程间共享可变数据”大体比较关注,各位老铁们都需要知道一些“线程安全集合可以在多线程间共享可变数据”的相关知识。那么小编也在网上搜集了一些关于“线程安全集合可以在多线程间共享可变数据””的相关知识,希望你们能喜欢,小伙伴们一起来学习一下吧!

引子

每当我打开笔记本电脑、准备来一把愉快的lol排位之前,我总会先默默点开任务管理器,把一些无关的进程手动结束,以此减小电脑CPU和内存的压力。

在生活和工作中,我们总是会在电脑特别卡的情况下关闭进程提高电脑反应速度,在本篇核心内容开启之前,我们首先来对进程做一个大致的介绍。

进程

什么是进程?

我们的服务器只要保持开机状态,就会存在许多大大小小的运行程序,而每个程序都有一个独立的进程,进程和进程之间是相互独立的。

假如说,程序是一堆代码,进程就是支撑程序运行的过程。假如程序没有运行,进程就不存在,而负责在服务器上跑进程的则是CPU。

虽然我们看着任务管理器中的这些进程会觉得它们是同时在后台运行的,其实不然:一个CPU在同一时刻只能支持一个程序的进程,而之所以能够运行这么多程序,来源于并发和并行两种方式(当然也有人称之为串行和并行),通常所说的并发,其实是一个CPU加上多道技术实现的;而并行,是多个CPU的运行(当然也可以多CPU多道)。

本文不对并发和并行做具体的介绍。

线程安全

线程安全是多线编程时的计算机程序代码中的一个概念,线程安全的代码会在多条线程并行的过程中,通过同步机制确保各线程都能够正确且正常的执行,不会出现数据污染等意外状况发生。

通过这段句释,也许你仍然无法对线程安全形成具体概念,其实说到底,线程安全就是当多线程访问发生时采用加密机制,保护在一个线程访问该类的某个数据过程中,其他线程不能对其访问直到该线程读完才可以用,不会出现数据差错或污染。

线程安全状态分类

线程安全性的分类方法包括:不可变、线程安全、有条件线程安全、线程兼容和线程对立。只要明确地记录下线程安全特性,那么您是否使用这种系统都没关系。这种系统有其局限性 ——各类之间的界线不是百分之百地明确,而且有些情况它没照顾到。但是,这套系统是一个很好的起点。这种分类系统的核心是调用者是否可以或者必须用外部同步包围操作(或者一系列操作)。下面几节分别描述了线程安全性的这五种类别。

(一)不可变类

一个不可变的对象只要构建正确, 其外部可见状态永远不会改变, 永远也不会看到它处于不一致的状态。

Java 类库中大多数基本数值类如Integer、String 和BigInteger 都是原子性的、不可变的, 但Long 和Double 就不能保证其操作的原子性, 可在声明变量的时候用volatile 关键字。不可变对象上没有副作用, 并且缓存不可变对象的引用总是安全的。一个不可变的对象的一个引用可以自由共享,而不用担心被引用的对象要被修改。

(二)线程安全性类

线程安全性类的对象操作序列( 读或写其公有字段以及调用其公有方法) 都不会使该对象处于无效状态, 即任何操作都不会违反该类的任何不可变量、前置条件或者后置条件。

(三)有条件的线程安全类

有条件的线程安全类对于单独的操作可以是线程安全的, 但是某些操作序列可能需要外部同步。为了保证其它线程不会在遍历的时候改变集合, 进行迭代的线程应该确保它是独占性地访问集合以实现遍历的完整性。通常, 独占性的访问是由对锁的同步机制保证的。

(四)线程兼容类

线程兼容类不是线程安全的, 但可以通过正确使用同步从而在并发环境中安全地使用。或用一个synchronized块包含每一个方法调用。

(五)线程对立类

不管是否调用了外部同步,有些类都不能在并发使用中保证其安全,而这样的类就叫做线程对立类。

线程对立类很少见, 只有当类修改静态数据、而静态数据对其它线程中执行的其它类的行为产生影响后, 才会出现线程对立。

标签: #线程安全集合可以在多线程间共享可变数据