Files
Hui-s-notebook/并发编程的其他基础知识.md
2023-09-10 10:50:53 +08:00

2.1 KiB

synchorizned

通过锁来保证线程安全性

volitale

保证内存可见性,不保证原子性操作

原子性操作

执行一系列操作时,这些操作要么全部执行

CAS 操作

  • boolean compareAndSwapLong(Object obj, long valueOffset, long expect, long update) 四个操作数,对象内存位置,对象中的变量偏移量,变量预期量,新的值

CAS操作的ABA问题,添加唯一标记,如时间戳

Unsafe 类

类中的方法都是native方法,使用JNI的方式访问本地C++实现库

  • long objectFieldOffset(Field field),返回指定的变量在所属的类中的内存偏移地址
  • int arrayBaseOffset(Class arrayClass)获取数组中第一个元素地址
  • int arrayIndexScale(Class arrayClass)获取数组中一个元素占用字节
  • boolean compareAndSwapLong(Object obj, long offset, long expect, long update)比较对象obj中偏移量为offset的变量的值是否与expect相等,相等则使用update值更新,返回ture,否则返回false
  • public native long getLongvolatile(Object obj, long offset)获取对象
  • void putLongvolatile(Object obj, long offset, long value)
  • void putOrderedLong(Object obj, long offset, long value)
  • void park(boolean isAbsolute, long time)
  • void unpark(Object thread)
  • long getAndSetLong(Object obj, long offset, long update)
  • long getAndAddLong(Object obj, long offset, long value)

指令重排序

内存模型允许编译器和处理器对指令重排序以提高运行性能,只会对不存在数据依赖性的指令重排序 使用volatile可以避免重排序在多线程下非预期的程序执行结果

伪共享

CPU与主内存之间存在一级或多级高速缓存,Cache内部按行存储,一行可能有多个变量,多个线程只能有一个操作缓存行

JDK8之前通过字节填充避免,之后通过@sun.misc.Contended注解解决,默认情况下该注解只适用于Java核心类

锁概述

乐观锁和悲观锁

公平锁和非公平锁

  • 公平锁:ReentrantLock pairLock = new ReentrantLock(true)
  • 非公平锁:ReentrantLock pairLock = new ReentrantLock(false) 默认为非公平锁

独占锁和共享锁

可重入锁

自旋锁