博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程安全问题
阅读量:5319 次
发布时间:2019-06-14

本文共 780 字,大约阅读时间需要 2 分钟。

  今天面试被问到线程安全,咋一愣,有点懵,一时间竟不知道讲点啥,回来好好总结了一下;

  首先,线程安全就是在多线程的情况下,如果对于一个共享变量的使用产生的结果是唯一确定的,那么便认为是线程安全!!!

  那么在多线程的情况下,要想对一个共享的变量保证其为线程安全,则简单粗暴的方法就是对其操作的时候进行加锁,就是当一个线程占有此变量的时候不允许其他的线程对他进行操作,必须等到此线程对改变成的修改完成之后方能由其他变量对他进行操作。

  还有一种就是cas,这家伙就是一个线程开始取了共享变量作为一个预期值,当要用的时候再看一下内存里的该变量是否与上次的预期值一样,当发现一样的时候,它就认为没有线程和我一起玩这个变量,我就可以对他进行操作,并且它此时对共享变量进行操作的时候利用的是lock总线锁,从最底层保证了原子性;而当他发现内存里面的值和原来取出来的预期值不一样时,就认为有线程对此变量进行操作了,则放弃此次操作,并且更新预期值,再重复以上操作直至完成。

  至于volatile,这家伙就是保证了共享变量在各个线程之间的可见性,例如内存中的i = 1;其中两线程对 i 进行了读取操作,然后其中一个将 i 变为2;当 i 由volatile修饰的时候,内存和另一个线程中的 i 就会作废,并更新为新的 i ,和缓存的操作差不多,但是这个关键字只能保证可见性,而不能保证原子性,比如 i++ 这个语句其实是由三步组成的:将 i 取出,对它进行++操作,将操作后的 i 放回;而volitile是不能保证这三步一起完成,即当你取出来还没有进行++操作的时候可能别的线程又拿到了 i 并对他进行了操作,这样 i 的结果就不确定了,即保证不了安全性

 

转载于:https://www.cnblogs.com/ming-zhi/p/8597735.html

你可能感兴趣的文章
Linux 的 date 日期的使用
查看>>
PHP zip压缩文件及解压
查看>>
SOAP web service用AFNetWorking实现请求
查看>>
jQuery Easy UI Resizable(调整大小)组件
查看>>
Sail
查看>>
C# JSON字符串序列化与反序列化
查看>>
HTTPS、SPDY和HTTP/2的性能比较
查看>>
Java变量类型,实例变量 与局部变量 静态变量
查看>>
Angular实践----理解数据绑定过程
查看>>
sublime快捷键
查看>>
mysql操作命令梳理(4)-中文乱码问题
查看>>
Hyper-V Centos7 网络设置 虚拟机固定IP
查看>>
Python环境搭建(安装、验证与卸载)
查看>>
一个.NET通用JSON解析/构建类的实现(c#)
查看>>
Windows Phone开发(31):画刷 转:http://blog.csdn.net/tcjiaan/article/details/7460226
查看>>
Windows Phone开发(5):室内装修 转:http://blog.csdn.net/tcjiaan/article/details/7269014
查看>>
记Angular与Django REST框架的一次合作(2):前端组件化——Angular
查看>>
08.存储Cinder→5.场景学习→08.Backup Volume→1.概述与配置
查看>>
进阶之路(基础篇) - 012 Arduino IDE 添加DHT11传感器第三方库的方法
查看>>
详谈js面向对象 javascript oop,持续更新
查看>>