一、伪共享
当多线程修改互相独立的变量时,如果这些变量共享同一个缓存行,就会无意中影响彼此的性能,这就是伪共享。伪共享只是影响性能,并不会带来程序上的错误
伪共享被称为并发编程的隐形杀手,因为开发者很难感知伪共享问题
对于多个线程共享的热点数据,即经常会修改的数据,应该避免这些数据刚好在同⼀个 Cache Line 中,否则就会出现为伪共享的问题。
其实很简单,就是2个线程x和y分别操作2个变量A和B,如果x操作了A就会使A所在的缓存行变为失效状态,恰巧A和B在一个缓存行, B也会失效,那线程y想操作B的时候只能从内存中获取,缓存就没起作用了
解决方法
我们可以凑齐不够的字节,补满64字节,牺牲空间换时间,因为一般缓存行的大小为64字节
JDK8解决伪共享问题可以使用@Contended注解,JVM需要添加参数 -XX:-RestrictContended才能开启此功能
在类上应用@Contended,会使他的所有成员变量都填充,在字段上添加就只填充这个字段
二、任务调度
Linux下分为实时任务和普通任务,实时任务总是会⽐普通任务优先被执⾏。
如果你想让某个普通任务有更多的执⾏时间,可以调整任务的 nice 值, 值越低,表明优先级越⾼
因此 nice 值调整的是普通任务的优先级。
我们可以在启动任务的时候,可以指定 nice 的值,⽐如将 mysqld 以 -3 优先级:
如果想修改已经运⾏中的任务的优先级,则可以使⽤ renice 来调整 nice 值:
nice 调整的是普通任务的优先级,所以不管怎么缩⼩ nice 值,任务永远都是普通任务,如果某些任务要求实时性⽐较⾼,那么你可以考虑改变任务的优先级以及调度策略,使得它变成实时任务