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

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

记得今年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…

JS中的回调函数

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>05_回调函数</title> </head> <body> <button id"btn">测试点击事件</button> <!-- 1. 什么函数才是回调…

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

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

android sharedpreferences工具类

package com.xt.deeptest5g.Utils;import android.content.Context; import android.content.SharedPreferences;/*** author : ZJS* e-mail : * date : 20-7-30下午7:46* desc : 用户账户信息保存工具类* version : 1.0*/ public class SharedPreferencesUtils {/*** 保存…

学习心得——刘文瑞

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

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

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

JS中的(IIFE)(立即调用函数)

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>06_IIEF</title> </head> <body> <!-- 1. 理解* 全称: Immediately-Invoked Function Expression 立即调用函数表达式* 别名: 匿…

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

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

dp与px相互转换

package com.xt.deeptest5g.Utils;import android.content.res.Resources;/*** author : ZJS* e-mail : 15574564770163.com* date : 20-7-30下午9:02* desc : dp与px相互转换* version : 1.0*/ public class DensityUtil {public float density;public DensityUtil() {den…

学习心得——袁康凯

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

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

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

使用CSharp编写Google Protobuf插件

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

JS中关于能不能加分号

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>01_分号问题</title> </head> <body><!-- 1. js一条语句的后面可以不加分号 2. 是否加分号是编码风格问题, 没有应该不应该&…

浅析onWindowsFocusChanged()方法

浅析onWindowsFocusChanged()方法

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

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

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

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

万圣节之夜

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

Visual Studio的未来特性展望

今天&#xff08;5月12日&#xff0c;西雅图&#xff09;的Build大会上&#xff0c;Microsoft的Amanda Silver和Tim Sneath针对Visual Studio 2017未来将会提供的特性做了演讲。Microsoft所聚焦的一个领域是改进IDE对所有用户的无障碍访问&#xff0c;包括视力障碍者。 事实上…

JS中函数的prototype属性和对象的__proto__属性

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>02_显式原型与隐式原型</title> </head> <body> <!-- 1. 每个函数function都有一个prototype&#xff0c;即显式原型 2. 每个实例…

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…