2.1 KiB
2.1 KiB
通过锁来保证线程安全性
保证内存可见性,不保证原子性操作
原子性操作
执行一系列操作时,这些操作要么全部执行
CAS 操作
- boolean compareAndSwapLong(Object obj, long valueOffset, long expect, long update) 四个操作数,对象内存位置,对象中的变量偏移量,变量预期量,新的值
CAS操作的ABA问题,添加唯一标记,如时间戳
类中的方法都是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) 默认为非公平锁
独占锁和共享锁
可重入锁
自旋锁