热门标签 | 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



推荐阅读
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • PyCharm下载与安装指南
    本文详细介绍如何从官方渠道下载并安装PyCharm集成开发环境(IDE),涵盖Windows、macOS和Linux系统,同时提供详细的安装步骤及配置建议。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文介绍了如何使用 Spring Boot DevTools 实现应用程序在开发过程中自动重启。这一特性显著提高了开发效率,特别是在集成开发环境(IDE)中工作时,能够提供快速的反馈循环。默认情况下,DevTools 会监控类路径上的文件变化,并根据需要触发应用重启。 ... [详细]
  • 深入理解Tornado模板系统
    本文详细介绍了Tornado框架中模板系统的使用方法。Tornado自带的轻量级、高效且灵活的模板语言位于tornado.template模块,支持嵌入Python代码片段,帮助开发者快速构建动态网页。 ... [详细]
  • 本文介绍如何利用动态规划算法解决经典的0-1背包问题。通过具体实例和代码实现,详细解释了在给定容量的背包中选择若干物品以最大化总价值的过程。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 深入解析:手把手教你构建决策树算法
    本文详细介绍了机器学习中广泛应用的决策树算法,通过天气数据集的实例演示了ID3和CART算法的手动推导过程。文章长度约2000字,建议阅读时间5分钟。 ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
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社区 版权所有