记得今年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值是一样的。

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

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

PS:那么你知道有哪些方法可以保证线程安全吗?

欢迎大家在留言区留言

什么是线程安全,你真的了解吗?相关推荐

  1. 如图两道面试题,顺便深入线程池,并连环17问

    这两面试题是基友朋友最近去面滴滴遇到的,今天就借着这两面试真题来深入一波线程池吧,这篇文章力求把线程池核心点和常问的面试点一网打尽,当然个人能力有限,可能会有遗漏,欢迎留言补充! 先把问题列出来,如果 ...

  2. 简谈Redis的线程模型

    Redis线程模型 Redis真的是单线程的吗 ? 为什么说Redis单线程速度这么快? IO多路复用 Redis真的是单线程的吗 ? Redis的单线程主要是指处理网络IO请求和键值对的读写是单线程 ...

  3. java 事件分发线程_深入浅出Java多线程(2)-Swing中的EDT(事件分发线程) [转载]...

    本系列文章导航 本文主要解决的问题是: 如何使其Swing程序只能运行一个实例? 抛开Swing, 我们的程序是通过java 命令行启动一个进程来执行的,该问题也就是说要保证这个进程的唯一性,当然如果 ...

  4. tomcat线程循环异常终止_资深架构师带你从JVM层面了解线程的启动和停止

    文章简介 这一篇主要围绕线程状态控制相关的操作分析线程的原理,比如线程的中断,线程的通信等,内容比较多,可能会分两篇文章 内容导航 线程的启动的实现原理 线程停止的实现原理分析 为什么中断线程会抛出I ...

  5. 线程数究竟设多少合理

    线程数究竟设多少合理  一.需求缘起 Web-Server通常有个配置,最大工作线程数,后端服务一般也有个配置,工作线程池的线程数量,这个线程数的配置不同的业务架构师有不同的经验值,有些业务设置为CP ...

  6. 一文彻底搞懂线程安全问题

    点击关注公众号,实用技术文章及时了解 来源:juejin.cn/post/6977173836584353822 前言 关于线程安全问题是一块非常基础的知识,但基础不代表简单,一个人的基本功能往往能决 ...

  7. Java并发之线程池ThreadPoolExecutor源码分析学习

    线程池学习 以下所有内容以及源码分析都是基于JDK1.8的,请知悉. ​ 我写博客就真的比较没有顺序了,这可能跟我的学习方式有关,我自己也觉得这样挺不好的,但是没办法说服自己去改变,所以也只能这样想到 ...

  8. 以爬虫为例,单线程,协程,线程,进程之间性能的比较,原来协程可以这么快?

    前言 因为刚刚学习到了协程,然后之前也对爬虫有一定的了解,所以打算结合之前学的线程和进程,和协程进行对比,看看它的性能到底有多高,在测试完成后,结果还是不错的!下面就直接上代码了,因为代码逻辑都比较简 ...

  9. 5个步骤,教你瞬间明白线程和线程安全

    作者 | 一个程序员的成长 责编 | 胡巍巍 记得今年3月份刚来杭州面试的时候,有一家公司的技术总监问了我这样一个问题:你来说说有哪些线程安全的类?我心里一想,这我早都背好了,稀里哗啦说了一大堆. 他 ...

  10. Tomcat 调优及 JVM 参数优化

    Tomcat 本身与 JVM 优化 Tomcat:调整Server.xml JVM:bat启动服务方式的话修改catalina.bat 服务式启动的话参考:http://www.cnblogs.com ...

最新文章

  1. Linux C编程之一:Linux下c语言的开发环境
  2. Promethus+Grafana监控解决方案
  3. C# 学习笔记(7) 进程
  4. EOS 智能合约源代码解读 (10)token合约“几种关键操作”
  5. Error: Could not find or load main class org.apache.tez.dag.app.DAGAppMaster
  6. jboss eclipse_调试生产服务器– Eclipse和JBoss展示
  7. Centos7 安装Oracle JDK1.8和OpenJDK 1.8
  8. wp转shp_将china.wl拓扑生成的wp面转换成shp格式,然后在arcgis中打开,截图,提交截图。...
  9. sql server 日期时间操作
  10. 【CSS】CSS样式的优先级
  11. [不好分类]《凤凰项目》读后感
  12. 【量化数据分析】Amos拟合优度与假设检验
  13. 沈阳工业大学计算机专业排名,中国的大学计算机专业排名。
  14. 英文版软件工程试题模拟试题
  15. Element DateTimePicker 日期时间选择器 今天日期设置,并获取value值
  16. 【机器学习7】决策树
  17. PS:给图片添加方格
  18. android修改图片(修改图片大小,图片旋转,图片平移)
  19. Web服务器(01)——介绍web服务器
  20. closing entry怎么做_牛排三分熟怎么说?刀叉如何摆放?来看看这些西餐知识你知道多少?另有热门院校大盘点...

热门文章

  1. 【Leetcode】62. 不同路径
  2. 【前端Talkking】CSS系列-css3之box-shadow介绍
  3. 【模板】可持久化线段树 1(主席树)
  4. 大数据销售管理服务提供商InsideSales获得1亿美元融资
  5. CTO下午茶: 没有安全,一切创新都是套路
  6. objective-c 多媒体 音乐播放
  7. 好文转载—程序员在工作中会追求什么?
  8. JTStackController
  9. Windows Server 2003显示中文为乱码(方框)的问题
  10. 在启用sharepoint portal server 2003的SSO时,提示“无法连接到数据库服务器,请检查配置账户的权利”的问题的解决方法...