目录
1.2、本地线程分配缓冲(Thread Local Allocation Buffer,TLAB)
一、JAVA对象的创建
Java对象的创建过程图解:
1、内存分配的并发问题
内存分配需要执行两个步骤:1、内存分配;2、指针修改;可能出现正在给对象A分配内存,指针还没来得及修改,对象B又同时使用了原来的指针来分配内存的情况。
解决并发问题的方法:
1.1、CAS(compare and swap)乐观锁
虚拟机采用CAS配置上失败重试的方式保证更新操作的原子性来对分配内存空间的动作进行同步处理。
乐观锁和悲观锁的区分:
悲观锁:独占锁是一种悲观锁,而 synchronized 就是一种独占锁,synchronized 会导致其它所有未持有锁的线程阻塞,而等待持有锁的线程释放锁。
乐观锁: 所谓乐观锁就是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。而乐观锁用到的机制就是CAS。
什么是CAS?
CAS机制当中使用了3个基本操作数:内存地址V,旧的预期值A,要修改的新值B。
更新一个变量的时候,只有当变量的预期值A和内存地址V当中的实际值相同时,才会将内存地址V对应的值修改为B。
这个操作就是使用期待值与地址的实际值进行比较,如果地址的实际值跟预期值一样,说明我们这个数据就是我们需要操作的数据,可以执行修改操作(操作正确的数据),但是地址的实际值与期待值不一致时,说明此时想要操作的值已经被篡改过了,因此不能再操作这个篡改后的值(在错误的数据上操作只能得到错误的结果)。
当操作失败时,线程重新获取内存地址V的当前值,并重新计算想要修改的新值。这个重新尝试的过程被成为自旋。
对于CAS的理解请尝试这篇文章:
https://blog.youkuaiyun.com/qq_35571554/article/details/82892806