当前位置: 首页 > news >正文

java 并发安全_Java 并发 – 线程安全?

线程安全的定义常常让人迷惑,搜索引擎会发现无数定义,比如:

多个线程同时执行也能正确工作就是线程安全的代码

多个线程同时执行能以正确的方式操纵共享数据就是线程安全的代码。

而且还有很多类似的定义

你是否认为这种定义实际上没有任何意义而且还让人更加迷惑?虽然这些定义没错,但事实是他们没有提供任何实际的帮助或观点。我们如何区分线程安全类和不安全类?我们所谓的“安全”是什么意思?

线程安全的正确性是什么?

线程安全的任何合理定义的核心是正确性的概念。因此,在了解线程安全之前,我们首先应该理解这个“正确”。

正确性意味着一个类符合它的规范。

一个好的类规范将在任何给定的时间拥有关于一个类的状态的所有信息,在其上执行某些操作以及它的后置条件。但我们经常没有为我们的类写出足够的规范,我们怎么可能知道它们能正确的使用呢?我们不能,但这并不能阻止我们使用它们,一旦我们说服自己“代码有效”。这种“代码自信”来自于我们接近正确。

乐观地将“正确性”定义为可以被识别的东西,现在我们可以用一种不那么绕的方式定义线程安全:当一个类在从多个线程访问时继续正常运行时,它是线程安全的。

不管运行时环境线程调度如何交织,只有当从多个线程访问它行为正确,以及调用代码的部分没有额外的同步或其他协调,那么这个类是线程安全的

如果这个宽泛的“正确性”让你觉得比较烦,那么您可能会认为线程安全类是一个在并发环境中比单线程环境中更糟的类。线程安全类封装了所需的同步,这样客户端就不必提供自己的同步。

示例:无状态servlet

线程安全类的一个很好的例子是java servlet没有字段(fields)和引用(references),没有来自别的类的字段,它们是无状态的。

public class StatelessFactorizer implementsServlet

{public voidservice(ServletRequest req, ServletResponse resp)

{

BigInteger i=extractFromRequest(req);

BigInteger[] factors=factor(i);

encodeIntoResponse(resp, factors);

}

}

在特定计算瞬间数据仅存储在正在在执行线程的堆栈上,即局部变量。一个线程访问一个statelessfactorizer不会影响另一个线程访问同一个statelessfactorizer产生的结果;因为两个线程不共享状态,就好像他们访问不同的实例。由于某个线程对无状态对象的的访问操作不会影响其他线程中操作的正确性,无状态对象是线程安全的。

这就是围绕线程安全的这个小而重要的概念

Happy Learning !!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 参加China Foo Camp随感(组图)
  • java面试完还要做题_不想搞Java了,6年经验去面试10分钟结束,现在Java面试为何这么难...
  • 再谈日文编码字符显示长度的计算
  • 购物系统java无框架_Javagouwuche 购物车的基本框架实现简单 界面选择,结算系统等,比较全面的 项目。 Jsp/Servlet 254万源代码下载- www.pudn.com...
  • Oracle Data Mining函数和算法
  • java collections.sort 从大到小_Java中Collections.sort()的用法
  • Windows Embedded从入门到精通课程介绍
  • java基础反射知识总结_java基础反射知识总结
  • 是什么让你萌发了跳槽的念头?
  • java汉字如何通过字节传输_java 20 - 8 字节流的文件复制以及汉字在计算机中的存储方式...
  • 《赢在用户》——UI设计的启蒙书
  • XML 路径语言(XPath) 版本 1.0
  • JAVA猜测随机整数_Java程序设计:产生随机数,让用户猜测
  • addslashes php,PHP如何使用addslashes()函数?(代码示例)
  • OWB和ODM的产品信息
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • FastReport在线报表设计器工作原理
  • Objective-C 中关联引用的概念
  • React+TypeScript入门
  • Spring Boot MyBatis配置多种数据库
  • Swoft 源码剖析 - 代码自动更新机制
  • Unix命令
  • 阿里云前端周刊 - 第 26 期
  • 分享几个不错的工具
  • 巧用 TypeScript (一)
  • 如何实现 font-size 的响应式
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 小程序测试方案初探
  • ​ssh免密码登录设置及问题总结
  • #define 用法
  • #HarmonyOS:基础语法
  • (3) cmake编译多个cpp文件
  • (4)logging(日志模块)
  • (day18) leetcode 204.计数质数
  • (ISPRS,2021)具有遥感知识图谱的鲁棒深度对齐网络用于零样本和广义零样本遥感图像场景分类
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (六)软件测试分工
  • (四)汇编语言——简单程序
  • (转)ABI是什么
  • (转)EOS中账户、钱包和密钥的关系
  • (转)编辑寄语:因为爱心,所以美丽
  • (转)创业家杂志:UCWEB天使第一步
  • (转载)从 Java 代码到 Java 堆
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .JPG图片,各种压缩率下的文件尺寸
  • .NET Core 项目指定SDK版本
  • .net 调用海康SDK以及常见的坑解释
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • @SuppressWarnings(unchecked)代码的作用
  • @TableLogic注解说明,以及对增删改查的影响