伪共享
伪共享 从字面意思,我一开始理解的有点迷糊,一开始以为在内存中的变量是不可靠的呢,但是不是!它带来的影响是,会造成多线程操作同一个缓存行的变量性能下降,因为同一个缓存行的修改,只能能同时被一个线程修改,这样就失去了多线程的意义 ...
伪共享 从字面意思,我一开始理解的有点迷糊,一开始以为在内存中的变量是不可靠的呢,但是不是!它带来的影响是,会造成多线程操作同一个缓存行的变量性能下降,因为同一个缓存行的修改,只能能同时被一个线程修改,这样就失去了多线程的意义 ...
unsafe类 JDK 的此jar包中 的 Unsafe 类提供了硬件级别的原子性操作 ,Unsafe 类中的方法都是native 方法 ,它们使用JNI的方式访问本地 C++实现库。 使用unsafe类 完成copareAndSwap /** * @author ggBall * @version 1.0.0 * @ClassName UnsafeSateTest.java * @Description 获取不到unsafe app类加载器加载不到 unsafe 因为unsafe只允许bootstrap类加载器获取,Unsafe.getUnsafe()里面也做了判断只允许bootstrap类加载器加载 * @createTime 2022年04月30日 16:44:00 */ public class UnsafeSateTest { static final Unsafe unSafe = Unsafe.getUnsafe(); static long stateOffset = 0; private volatile long state = 0; static { try { // 拿到 属性state在类UnsafeSateTest的偏移量 stateOffset = unSafe.objectFieldOffset(UnsafeSateTest.class.getDeclaredField("state")); } catch (NoSuchFieldException e) { e.printStackTrace(); } } public static void main(String[] args) { UnsafeSateTest unsafeSateTest = new UnsafeSateTest(); boolean result = unSafe.compareAndSwapLong(unsafeSateTest, stateOffset, 0, 1); System.out.println("result = " + result); } } /** * @author ggBall * @version 1.0.0 * @ClassName UnsafeSateTest.java * @Description 利用反射获取unsafe * @createTime 2022年04月30日 16:44:00 */ public class UnsafeSateTest2 { static Unsafe unSafe; static long stateOffset = 0; private volatile long state = 0; static { try { Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe"); theUnsafe.setAccessible(true); // 获取该变量的值 unSafe = (Unsafe)theUnsafe.get(null); // 拿到 属性state在类UnsafeSateTest的偏移量 stateOffset = unSafe.objectFieldOffset(UnsafeSateTest2.class.getDeclaredField("state")); } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); } } public static void main(String[] args) { UnsafeSateTest2 unsafeSateTest = new UnsafeSateTest2(); boolean result = unSafe.compareAndSwapLong(unsafeSateTest, stateOffset, 0, 1); System.out.println("result = " + result); }
什么是多线程并发编程 了解什么是并发,什么是并行? 并发:一段时间内,执行多个没有结束的任务。 并行:单位时间内,同时执行多个任务。 注意:并发任务强调在一个时间段内同时执行,而一个时间段由多个单位时间累积而成,所以说并发的多个任务在单位时间内不一定同时在执行 ...
ThreadLocal了解 原理解析 通过ThreadLocal获取当前线程保存的值的流程: 先得到当前线程对象 再从当前线程获取ThreadLocalMap 最后传入this(即ThreadLocal)获取对应的值 创建ThreadLocal时,里面的属性并未初始化,只有当第一次set时才会创建容器,且装数据的容器也不是放在ThreadLocal里面的,而是在Thread里面,一个是threadLocals,一个是inheritableThreadLocals,(数据结构都是hashMap)ThreaLocal只负责操作数据,并不负责储存 ...
概念 守护线程:jvm不关心守护线程是否执行完成,如果用户线程全都执行结束,那么jvm就会退出 用户线程:jvm会等待所有用户线程全都执行结束,jvm才会退出 ...