热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

线程安全解析(附带JVM内存结构和锁机制说明)

2019独角兽企业重金招聘Python工程师标准一、JVM内存结构和保存的变量属性(JVM调优和算法不涉及)1.堆、栈、方法区、程序计数器、本地方法栈--重点说堆、栈、方法区

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

一、JVM内存结构和保存的变量属性(JVM调优和算法不涉及)

1.堆、栈、方法区、程序计数器、本地方法栈--重点说堆、栈、方法区,本篇的讲解不涉及垃圾回收

堆:通过new关键字创建的对象的信息

栈:基本类型、堆中对象的引用、局部变量

方法区:static修饰静态变量、final常量、.class文件

2.其中堆和方法区属于被程序共享、里面的变量信息涉及到多线程访问的操作安全性,栈内存不做讲解、因为每次HTTP请求都会为当前线程分配独立的栈内存,请求执行完成、占内存会自动销毁释放空间,不涉及GC回收、属于线程独享的,栈内存中的信息属于线程安全

二、对于线程安全控制常用的方式ThreadLocal、Lock、Atomic工具包、Synchronized

1.ThreadLocal:对于每次的操作都会创建一个本地变量副本,该变量副本是从主存中读取的最新的数据,单独的变量副本之间是相互独立的,互不影响,而且ThreadLocal修饰的变量都是当前线程私有的,从性能上说是以空间换时间,对内存消耗比较大,但是效率好

2.Lock和Synchronized:这两者使用锁机制来实现操作安全控制,作用的粒度都很小,区别是前者是要手动关掉锁,如果有资源相互占用的情况下死锁的情况会出现,而且对性能影响比较大

3.Atomic提供的对变量的操作AtomicInteger、AtomicBoolean、AtomicLong...,使用ACS机制实现,属于一种无锁操作状态,类似于指令集的操作,性能上面效果较好

三、内存结构和锁有了了解之后主要涉及的就是方法区和堆区的变量操作,如何操作保证其安全性

1.多例模式下

大家常用的springMVC和struts2对比可以知道,struts2创建的对象是多例模式,每次的HTTP请求都会单独的创建对象,当前的线程操作独有的,所以是线程安全的,struts2整合spring时对象交给spring管理所以一般scope属性会设置为prototype,但是要注意的是多例模式的安全性设计的是非static变量,如果涉及到static修饰的变量,该变量在JVM加载的时候是在方法区保存,所以多线程情况下不是线程安全的,变量可以用ThreadLocal来修饰,变为线程私有属性保证操作安全性

2.单例模式下:

2.1:单例:有状态和无状态bean

2.1.1:无状态bean是线程安全的、比如service、dao、对象的状态初始化的时候不会发生改变

2.1.2:有状态的bean非线程安全的,涉及到保存操作

2.2:单例模式下创建的对象多次调用都是同一个,所以属于程序共享的,这里就涉及到线程安全,所以单例模式下的变量不管是static修饰还是非static都不是线程安全的

 


转:https://my.oschina.net/wubiaowpBlogShare/blog/1612064



推荐阅读
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • 无损压缩算法专题——LZSS算法实现
    本文介绍了基于无损压缩算法专题的LZSS算法实现。通过Python和C两种语言的代码实现了对任意文件的压缩和解压功能。详细介绍了LZSS算法的原理和实现过程,以及代码中的注释。 ... [详细]
  • 【MicroServices】【Arduino】装修甲醛检测,ArduinoDart甲醛、PM2.5、温湿度、光照传感器等,数据记录于SD卡,Python数据显示,UI5前台,微服务后台……
    这篇文章介绍了一个基于Arduino的装修甲醛检测项目,使用了ArduinoDart甲醛、PM2.5、温湿度、光照传感器等硬件,并将数据记录于SD卡,使用Python进行数据显示,使用UI5进行前台设计,使用微服务进行后台开发。该项目还在不断更新中,有兴趣的可以关注作者的博客和GitHub。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
  • 一次上线事故,30岁+的程序员踩坑经验之谈
    本文主要介绍了一位30岁+的程序员在一次上线事故中踩坑的经验之谈。文章提到了在双十一活动期间,作为一个在线医疗项目,他们进行了优惠折扣活动的升级改造。然而,在上线前的最后一天,由于大量数据请求,导致部分接口出现问题。作者通过部署两台opentsdb来解决问题,但读数据的opentsdb仍然经常假死。作者只能查询最近24小时的数据。这次事故给他带来了很多教训和经验。 ... [详细]
author-avatar
UPI
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有