问题:并发情况下,可能出现正在给对象A分配内存,指针还没来得及修改,对象B又同时使用了原来的指针来分配内存的情况。
方案一:采用CAS加上失败重试的方法保证更新操作的原子性,比较和交换;不加锁,通过while(true)死循环来判断对象新的地址
方案二:本地线程分配缓冲(TLAB 默认开启)。把内存分配的动作按照线程划分在不同的空间之中进行,即每个线程在Java堆中预先分配一小块内存,哪个线程要分配内存,就在哪个线程的本地缓冲区中分配,只有本地缓冲区用完了,分配新的缓存区时才需要同步锁定。
问题:并发情况下,可能出现正在给对象A分配内存,指针还没来得及修改,对象B又同时使用了原来的指针来分配内存的情况。
方案一:采用CAS加上失败重试的方法保证更新操作的原子性,比较和交换;不加锁,通过while(true)死循环来判断对象新的地址
方案二:本地线程分配缓冲(TLAB 默认开启)。把内存分配的动作按照线程划分在不同的空间之中进行,即每个线程在Java堆中预先分配一小块内存,哪个线程要分配内存,就在哪个线程的本地缓冲区中分配,只有本地缓冲区用完了,分配新的缓存区时才需要同步锁定。