当前位置:   article > 正文

jvm在分配内存的时候如何保证线程安全?_jvm在分配内存的时候如何保证线程安全?

jvm在分配内存的时候如何保证线程安全?

最近记录了一些java中常踩的坑、设计思路和小知识点,大家可以看看
详细记录一次接入xxl-job的踩坑路径
30s快速解决循环依赖
idea中一个小小的操作竟能解决如此多的问题
docker中的服务接入xxljob需要注意的一点
关于一次fullgc的告警分析
mysql中的int类型竟变成了它?
jpa中的字段总是自己莫名更新?
获取不到类上的注解?空指针?
学会这招,再也不怕依赖冲突!
redis的热点key还能这么处理?
领导让我设计一个任务系统
当服务重启时,大部分人没考虑这点
参数还能这么优雅校验?
文件上传报错,全局异常处理!
常见的点赞功能如何实现,如何防止刷赞
分配内存的时候为什么会线程不安全?
因为JVM堆内存是共享
创建对象是会在多个线程中都会出现的操作
线程在new对象的时候,需要拿一块内存去存放,可以理解为需要从一个空闲内存列表中拿取空闲内存。
如果不做任何限制,那么多线程的场景下,极有可能出现多个线程分配到同一块内存的情况。
也就是所谓的线程不安全了

如何解决
解决线程不安全的思想大概可以归为两类

  • 给线程不安全的方法加锁
  • 线程隔离

解决方法1-加锁:
一个很通用的思想就是,给线程不安全的操作加锁
同样适用于分配内存
如果我们给jvm堆中,分配内存这个操作加锁,所有线程需要new对象,需要内存去实例化的时候,都需要先获取这个"分配内存锁"。
很显然,是可以保证线程安全的,不会出现多个线程分配到同一块内存的情况
但是缺点也是明显的,因为分配内存这是一个高并发的操作,如果给这个操作加锁,那么会极大的影响效率。
解决方法2-线程隔离:
线程隔离的思想其实也有很多用处,比如编程时候常见的ThreadLocal
或者是JVM内存模型ThreadLocal
在jvm分配内存的时候也可以用到线程隔离的思想,就是TLAB(Thread Local Allocation Buffer)
简单来说,就是每个线程在创建的时候,会分配到一块属于自己的内存
内存大小由jvm当时运行情况计算决定
这块内存的特殊性就在于,jvm分配内存的时候会优先分配到自己的TLAB中,除此之外的操作都和堆中其他内存块没有区别
这个方式比加锁要高效很多。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/728464
推荐阅读
相关标签
  

闽ICP备14008679号