什么是线程安全,你真的了解吗

转载自  什么是线程安全,你真的了解吗

记得今年3月份刚来杭州面试的时候,有一家公司的技术总监问了我这样一个问题,说你给我说说有哪些线程安全的类,我心里一想,呵呵,这我早都背好了,稀里哗啦说了一大堆,那你再来说说什么是线程安全,然后就GG了,说真的,我们整天说线程安全,但是你对什么是线程安全真的了解嘛?说真的,我之前真的是了解甚微,那么我们今天就来聊聊这个问题。

再说什么是线程安全之前我们先来聊聊什么是进程。

1、什么是进程?

先来看一张图

我们看到的这些单独运行的程序就是一个独立的进程,进程之间是相互独立存在的。

我们上面图中的QQ、酷狗播放器、电脑管家等等都是独立的进程。

 

2、什么是线程?

上面简单的说了一下什么是进程,进程想要执行任务需要依赖线程,换句话说就是进程中的最小执行单位就是线程,并且一个进程中至少有一个线程。

 

3、什么是多线程?

提到多线程这里要说两个概念,就是串行和并行,搞清楚这个我们才能更好的理解多线程。

所谓串行其实是相对于单条线程来执行多个任务来说的,我们就拿下载文件来举个例子,我们下载多个文件,在串行中它是按照一定的顺序去进行下载的,也就是说必须等下载完A之后,才能开始下载B,它们在时间上是不可能发生重叠的。

并行:下载多个文件,开启多条线程,多个文件同时进行下载,这里是严格意义上的在同一时刻发生的,并行在时间上是重叠的。

了解了这两个概念之后我们再来说说什么是多线程,举个例子,我们打开腾讯关键,腾讯关键本身就是一个程序也就是说它就是一个进程,它里面有很多的功能,我们可以看下图,能查杀病毒、清理垃圾、电脑加速等众多功能,按照单线程来说,你想要清理垃圾还要病毒查杀,那么你必须先做完其中的一件事才能做下一件事,是有一个执行的顺序的,如果是多线程的话,我们其实在清理垃圾的时候还可以查杀病毒、电脑加速等等其他的操作,这个是严格意义上的同一时刻发生的,没有执行的先后顺序。

一句话总结一下:一个进程运行时产生了多个线程。

华丽的分割线

在了解完这个问题后,我们又需要去了解一个使用多线程不得不考虑的问题,线程安全,今天我们不说如何保证一个线程的安全,我们聊聊什么是线程安全?因为我之前面试被问到了,说真的,我之前真的不是特别了解这个问题,我们好像只学如何确保一个线程安全,却不知道所谓的安全到底是什么!

 

4、什么是线程安全?

既然是线程安全问题,那么毫无疑问所有的隐患都是出现在多个线程访问的情况下产生的,也就是我们要确保在多条线程访问的时候,我们的程序还能按照我们预期的行为去执行,我们看一下下面的代码。

Integer count = 0;public void getCount() {count ++;System.out.println(count);}

很简单的一段代码,我们就来统计一下这个方法的访问次数,多个线程同时访问会不会出现什么问题,我开启的3条线程每个线程循环10次,得到一下结果

我们可以看到,这里出现了两个26,为什么会出现这种情况,出现这种情况显然表明我们这个方法根本就不是线程安全的,出现这种问题的原因有很多,我们说最常见的一种,就是我们A线程在进入方法后,拿到了count的值,刚把这个值读取出来还没有改变count的值的时候,结果线程B也进来的,那么导致线程A和线程B拿到的count值是一样的。

那么由此我们可以了解这确实不是一个线程安全的类,因为他们都需要操作这个共享的变量,其实要对线程安全问题给出一个明确的定义还是蛮复杂的,我们根据我们这个程序来总结下什么是线程安全。

 

当多个线程访问某个方法时,不管你通过怎样的调用方式或者说这些线程如何交替的执行,我们在主程序中不需要去做任何的同步,这个类的结果行为都是我们设想的正确行为,那么我们就可以说这个类时线程安全的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/325548.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习心得——徐龙翥

19级青鸟3班 徐龙翥千里之行始于足下,不要认为html全是代码就认为学习起来特别艰难,如果你仔细观察的话就会发现,其实单词并没有多少,语法也并不复杂,只要做到上课认真听讲,课前预习以及课后复习&#xff0…

基于DotNet Core的RPC框架(一) DotBPE.RPC快速开始

0x00 简介 DotBPE.RPC是一款基于dotnet core编写的RPC框架,而它的爸爸DotBPE,目标是实现一个开箱即用的微服务框架,但是它还差点意思,还仅仅在构思和尝试的阶段。但不管怎么说RPC是微服务的基础,先来讲讲RPC的实现吧。…

学习心得——刘文瑞

19级青鸟3班 刘文瑞以前因为经常玩游戏的原因,导致我对软件特别感兴趣,但是由于学习到的东西不多,经常是在玩游戏,真正能运用到计算机上的知识实在是少的可伶。像是代码之类的东西,以前只是听说过,但是一点…

教你如何定位及优化SQL语句的性能问题

转载自 教你如何定位及优化SQL语句的性能问题 在现如今的软件开发中,关系型数据库是做数据存储最重要的工具。无论是Oracale还是Mysql,都是需要通过SQL语句来和数据库进行交互的,这种交互我们通常称之为CRUD。在CRUD操作中,最最…

SQL Server on Ubuntu——Ubuntu上的SQL Server(全截图)

本文从零开始一步一步介绍如何在Ubuntu上搭建SQL Server 2017,包括安装系统、安装SQL等相关步骤和方法(仅供测试学习之用,基础篇)。 一. 创建Ubuntu系统(Create Ubuntu System) 1. 前提准…

学习心得——袁康凯

19级青鸟3班 袁康凯时光荏苒,不知不觉来济南信息工程学校已经二个多月,失去的很多,但收获的更多。失去很多以前嗤之以鼻却又丢弃不掉的坏毛病,认识了很多新同学新老师,学习了很多新知识。环境的巨大变化让我不断地改变…

面试必考的网络协议相关题目应该如何回答

转载自 面试必考的网络协议相关题目应该如何回答 最近,正处于校招季。很多小伙伴已经拿到了如愿以偿的Offer,有些小伙伴还在努力着。 平常,也会有一些粉丝会在公众号留言,或者在微信上问我一些面试题。其中有一类问题是除了Jav…

使用CSharp编写Google Protobuf插件

什么是 Google Protocol Buffer? Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 个 .proto 文件。他们用于 RPC 系统和持续数据存储系统。 Protocol Bu…

jsp使用cookie实现记住用户名和密码

首先说一下实现的功能: 用户打开注册页面,最下面有个记住用户名和密码的复选框,如果勾选上,则在登录页面会自动将用户名和密码赋值到文本框中,使用java中的cookie实现,下面就是代码: 注册页面代…

集群、分布式、负载均衡区别

转载自 集群、分布式、负载均衡区别 参考:http://virtualadc.blog.51cto.com/3027116/615836” 集群 集群的概念 计算机集群通过一组松散集成的计算机软件和/或硬件连接起来高度紧密地协作完成计算工作。在某种意义上,他们可以被看作是一台计算机。集…

万圣节之夜

万 圣 节 昨天两位班主任就说今天班级有活动,从今天下午就开始了。18级下午都在布置教室,19级暂时没有行动。午休醒来之后,一脸高兴的去3班上课去。一进教室,同学们都在趴着睡觉呢。有点安静的不习惯了都。其中有个前排的女同学脸…

EL表达式和Jstl常见的用法

一、使用EL表达式获取集合中的数据&#xff1a; <%Map names new HashMap();names.put("one", "1");names.put("two", "2");request.setAttribute("names", names);int a 2;request.setAttribute("a", a);Us…

线上防雪崩利器——熔断器设计原理与实现

转载自 线上防雪崩利器——熔断器设计原理与实现 本文来自作者投稿&#xff0c;作者林湾村龙猫&#xff0c;这是一篇他根据工作中遇到的问题总结出的最佳实践。 上周六&#xff0c;我负责的业务在凌晨00-04点的支付全部失败了。 结果一查&#xff0c;MD&#xff0c;晚上银行…

ASP.NET Core 菜鸟之路:从Startup.cs说起

1.前言 本文主要是以Visual Studio 2017 默认的 WebApi 模板作为基架&#xff0c;基于Asp .Net Core 1.0&#xff0c;本文面向的是初学者&#xff0c;如果你有 ASP.NET Core 相关实践经验&#xff0c;欢迎在评论区补充。与早期版本的 ASP.NET 对比&#xff0c;最显著的变化之一…

el表达式与jstl的用法

课上顺便整理了下java中的El表达式和jstl的用法&#xff0c;下面以举例的方式来阐述各个标签的作用&#xff1a;一、 使用el表达式将Map集合中的数据显示出来&#xff1a;先给Map集合里面放一些数据库&#xff0c;通过EL表达式显示在页面中&#xff1a;<%Map names new Has…

业务太复杂?教你如何降低软件的复杂性

转载自 业务太复杂&#xff1f;教你如何降低软件的复杂性 John Ousterhout 是斯坦福大学计算机系教授&#xff0c;也是 Tcl 语言的创造者。 今年四月&#xff0c;他出版了一本新书《软件设计的哲学》&#xff08;A Philosophy of Software Design&#xff09;。这是课程讲稿…

[翻译]在 .NET Core 中的并发编程

原文地址:http://www.dotnetcurry.com/dotnet/1360/concurrent-programming-dotnet-core 今天我们购买的每台电脑都有一个多核心的 CPU&#xff0c;允许它并行执行多个指令。操作系统通过将进程调度到不同的内核来发挥这个结构的优点。然而&#xff0c;还可以通过异步 I/O 操作…

JS中函数和变量声明的提升

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>01_变量提升与函数提升</title> </head> <body> <!-- 1. 变量声明提升* 通过var定义(声明)的变量, 在定义语句之前就可以访问到*…

记录学生的日常

最近比较忙&#xff0c;都没时间更新公众号了&#xff0c;粉丝每天都在减&#xff0c;哈哈哈。最近19级的学生们在做网页设计静态网页项目&#xff0c;从上周五到现在&#xff0c;班内除了两个小组比较慢之外&#xff0c;其余的进度都还可以&#xff0c;从做项目中就可以看出来…

Mono新突破:CentOS 7.2下安装Mono 5.0

微软Build2017大会期间.NET领域的.NET core之外&#xff0c;就是Visual Studio For Mac&#xff0c;大家都知道Visual Studio For Mac 是基于Mono运行的&#xff0c;Mono 5.0也是闪亮登场&#xff0c;Mono 5.0是一个非常重要的里程碑版本&#xff0c;支持Windows 64位部署&…