热门标签 | 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编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 深入理解Java中的volatile、内存屏障与CPU指令
    本文详细探讨了Java中volatile关键字的作用机制,以及其与内存屏障和CPU指令之间的关系。通过具体示例和专业解析,帮助读者更好地理解多线程编程中的同步问题。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 探讨一个显示数字的故障计算器,它支持两种操作:将当前数字乘以2或减去1。本文将详细介绍如何用最少的操作次数将初始值X转换为目标值Y。 ... [详细]
  • 网络攻防实战:从HTTP到HTTPS的演变
    本文通过一系列日记记录了从发现漏洞到逐步加强安全措施的过程,探讨了如何应对网络攻击并最终实现全面的安全防护。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • python的交互模式怎么输出名文汉字[python常见问题]
    在命令行模式下敲命令python,就看到类似如下的一堆文本输出,然后就进入到Python交互模式,它的提示符是>>>,此时我们可以使用print() ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 深入解析:手把手教你构建决策树算法
    本文详细介绍了机器学习中广泛应用的决策树算法,通过天气数据集的实例演示了ID3和CART算法的手动推导过程。文章长度约2000字,建议阅读时间5分钟。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
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社区 版权所有