当前位置:网站首页>堆内存分配的并发问题
堆内存分配的并发问题
2022-06-24 19:35:00 【Nice2cu_Code】
在实际的开发过程中,会经常的创建对象,作为虚拟机,必须保证线程安全。通常来讲虚拟机采用两种方式保证线程安全
一、CAS + 失败重试
CAS是一种乐观锁的实现方式,每次不加锁假设没有冲突的去完成某项操作,如果因为冲突导致操作失败就重试,直到成功为止。详见博客,传送地址:Java并发编程之 无锁(CAS)
二、TLAB
TLAB是在Java堆空间的伊甸园划分出来的针对每个线程的内存空间,专门在该区域为该线程创建的对象分配内存。
它的主要目的是在并发环境下进行内存分配的时候,减少线程之间对于内存空间的竞争,加速内存分配的速度。
TLAB本质上还是在Java堆中的,所以在TLAB区域的对象,也可以被其他线程访问。
如果没有使用TLAB,多个并发执行的线程创建对象,分配内存的时候,有可能在Java堆中的同一个位置申请,这就需要对这部分内存空间进行加锁或者采用CAS等操作保证线程安全,即保证该区域只分配给一个线程。
使用了TLAB之后,JVM会针对每个线程在堆内存中预留一个内存区域,在预留这个操作发生的时候,需要进行加锁或者采用CAS等操作进行保护,避免多个线程预留同一个区域。一旦确定了某个区域分配给某个线程,之后该线程需要分配内存的时候,会优先在这片区域申请。这个区域对于该线程分配内存这个操作而言是线程私有的,因此在分配的时候不用进行加锁等操作,从而既保护了线程安全又提升了分配速度。
注意: 当该线程创建的对象大于TLAB中的剩余内存或者TLAB的内存已用尽时,再采用CAS + 失败重试的方式分配内存。
边栏推荐
猜你喜欢
随机推荐
60 个神级 VS Code 插件!!
985测试工程师被吊打,学历和经验到底谁更重要?
TCP RTT measurement tips
Uncover the secret of station B. is it true that programmers wear women's clothes and knock code more efficiently?
Introduction, installation and use of postman tool
MySQL gets fields and comments by indicating
Valueerror: cannot take a larger sample than population when 'replace=false‘
Summary of papers on traveling salesman problem (TSP)
I really can't do it. After 00, I collapsed and wanted to leave
Development of live broadcast software app, and automatic left-right sliding rotation chart advertising
A girl has been making hardware for ten years. 。。
Cannot find reference 'imread' in 'appears in pycharm__ init__. py‘
“阿里健康”们的逻辑早就变了
Description of transparent transmission function before master and slave of kt6368a Bluetooth chip, 2.4G frequency hopping automatic connection
NIO、BIO、AIO
Main steps of system test
Docker installs MySQL 8.0. Detailed steps
NIO多路复用之Selector的使用
华大04a工作模式/低功耗模式
OA system -- save the verification code to session









