上饶网站建设公司,郑州小程序开发公司排名,怎么搭建mysql数据库网站,公司网站的后台某个类有以下两个属性
volatile int a;
volatile int b;
int为4字节#xff0c;两个int为8字节#xff0c;一个缓存行大小为64字节
故一旦缓存行a失效了#xff0c;但是b没失效#xff0c;会连带着b一起失效#xff0c;因为失效最小的单位就是一个缓存行
这样子会导致效率…某个类有以下两个属性
volatile int a;
volatile int b;
int为4字节两个int为8字节一个缓存行大小为64字节
故一旦缓存行a失效了但是b没失效会连带着b一起失效因为失效最小的单位就是一个缓存行
这样子会导致效率变低故解决办法为让一个属性尽可能地独占一个缓存行
jdk中提供sun.misc.Contended注解会对标准了该注解的类或者属性提供额外的字节填充
原子计数器LongAdder源码中的Ceil类就是标注了该注解防止缓存行伪共享
cpu 修改某共享变量 a 时会先锁定 a 所在的缓存行并且把其他 cpu 缓存上相关的缓存行设置为无效。
如果被锁定或失效的缓存行里还存储了其他不相干的变量 b则会造成不必要的开销因为其他线程此时会访问不了 b或者由于缓存行失效需要重新从内存中读取b加载到缓存。
而如果 a 单独使用一个缓存行就可以避免此问题代码
import lombok.AllArgsConstructor;
import sun.misc.Contended;
import org.openjdk.jol.info.ClassLayout;public class TestAqs {public static void main(String[] args) {ContendedAllArgsConstructorclass Position {int x;int y;int z;}Position position new Position(1, 2, 3);String printable ClassLayout.parseClass(Position.class).toPrintable(position);System.out.println(printable);}
}现象添加sun.misc.Contended
TestAqs$1Position object internals:OFFSET SIZE TYPE DESCRIPTION VALUE0 4 (object header) 01 00 00 00 (00000001 00000000 00000000 00000000) (1)4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0)8 4 (object header) 28 55 5d ec (00101000 01010101 01011101 11101100) (-329427672)12 4 (object header) d3 01 00 00 (11010011 00000001 00000000 00000000) (467)16 128 (alignment/padding gap) 144 4 int TestAqs$1Position.x 1148 4 int TestAqs$1Position.y 2152 4 int TestAqs$1Position.z 3156 132 (loss due to the next object alignment)
Instance size: 288 bytes
Space losses: 128 bytes internal 132 bytes external 260 bytes total现象未添加sun.misc.Contended
TestAqs$1Position object internals:OFFSET SIZE TYPE DESCRIPTION VALUE0 4 (object header) 01 00 00 00 (00000001 00000000 00000000 00000000) (1)4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0)8 4 (object header) e0 54 3d 49 (11100000 01010100 00111101 01001001) (1228756192)12 4 (object header) 1a 02 00 00 (00011010 00000010 00000000 00000000) (538)16 4 int TestAqs$1Position.x 120 4 int TestAqs$1Position.y 224 4 int TestAqs$1Position.z 328 4 (loss due to the next object alignment)
Instance size: 32 bytes
Space losses: 0 bytes internal 4 bytes external 4 bytes total通过以上显现能分析出来该注解会给该对象首尾各添加128字节 前边儿填充128字节 后边儿填充132字节填充128字节由于对象大小必须是8的整数倍故外加4字节