标签:ble 适用于 处理 同步锁 ash code 调用 软件 read
Java 锁状态的级别从低到高为:无锁状态、偏向锁状态、轻量级锁状态、重要级锁状态,而锁的状态是被记录在 Java 对象的对象头中。
Java 的对象头:由 Mark Word、指向类的指针、数组长度,其中 Mark Word 负责记录有关锁的信息
32 位 JVM 中 Mark Word 存储的内容为
锁状态 | 25bit | 4bit | 1bit (是否是偏向锁) | 2bit (锁标志位) |
---|---|---|---|---|
无锁 | 对象的 HashCode | 分代年龄 | 0 | 01 |
偏向锁 | 线程 ID 与 Epoch | 分代年龄 | 1 | 01 |
轻量级锁 | 指向栈中的锁记录指针 | 同前 | 同前 | 00 |
重量级锁 | 指向重量级锁的指针 | 同前 | 同前 | 10 |
GC 标记 | 空 | 11 |
偏向锁、轻量级锁概念的出现,都是为了减少同步唤醒的代价,若所有锁都为重量级的,那么所有等待锁的线程必须进入阻塞态
Java 中锁的状态是一级一级往上升的,具体情况为:
从上一节我们可以看出来,Java 中能够作为锁的只能是对象,所以 synchronized 的实现,也是通过对对象进行加锁实现的。
Lock 是 java.util.concurrent.locks 包里的一个接口,对应的 ReentrantLock 类实现了该接口。
一般使用方法
public class LockTest {
private Lock alock = new ReentrantLock(); // 锁需要定义在具体使用锁的栈帧的上一层,即若在线程里定义的话,不同的线程会 new 出不同的锁,这样就不能实现同步了。
public static void main(String[] args) {
Runnable r = () -> {
alock.lock(); // 获得锁
try {
// do something
} catch(Exception e){
} finally{
alock.unlock();
}
}
Thread test = new Thread(r);
test.start();
}
}
获得锁的方法
除此之外,java.util.concurrent.locks 包内还定义有 ReadWriteLock 接口,并有多种读写锁的实现类。
一种轻量级同步机制,能够保证 volatile 修饰的变量具有可见性,但不具备原子性
前面提到过 Atomatic 是一种乐观锁,它是通过操作的原子性来保证自己的线程安全的,即操作是不可被打断的,且具有排他性。当某一线程进行该原子操作时,其他想要执行该操作的线程只能处于自旋状态,等待该操作完成。
标签:ble 适用于 处理 同步锁 ash code 调用 软件 read
原文地址:https://www.cnblogs.com/Melles/p/10657611.html