标签:ros rcv roi important record i++ 栈帧 down 可见
自旋锁 : 是指当一个线程在获取锁的时候,如果锁已经被其他线程获取,那么该线程将循环等待,然后不断判断锁是否能够被成功获取,直到获取到锁才会退出循环。
乐观锁 : 假定没有冲突,在修改数据时如果发现数据和之前获取的不一致,则读最新数据,修改后重试修改
悲观锁 :假定会发生并发冲突,同步所有对数据的相关操作,从读数据就开始上锁
独享锁(写) : 给资源加上写锁,拥有该锁的线程可以修改资源,其他线程不能再加锁(单写)
共享锁(读) : 给资源加上读锁后只能读不能改,其他线程也只能加读锁,不能加写锁 (多读)
可重入锁 :线程拿到一把锁后,可以自由进入同一把锁所同步的代码
不可重入锁 :线程拿到一把锁后,不可以自由进入同一把锁所同步的代码
公平锁 :争抢锁的顺序,按照先来后到的顺序
非公平锁 :争抢锁的顺序,不按照先来后到的顺序
Java中几种重要的锁实现方式:synchronized
, ReentrantLock
, ReentrantReadWriteLock
synchronized特性:可重入,独享,悲观锁
锁优化:
Note: synchronized关键字,不仅实现同步,JMM中规定,synchronized要保证可见性(不能够被缓存)
synchronized用法代码示例:
public class Counter {
private static int i = 0;
// 等价于 synchronized(this)
public synchronized void update() {
i++;
}
public void updateBlock() {
synchronized (this) {
i++;
}
}
// 等价于 synchronized (Counter.class)
public static synchronized void staticUpdate() {
i++;
}
public static void staticUpdateBlock() {
synchronized (Counter.class) {
i++;
}
}
}
要了解synchronized加锁在JVM中是如何实现的,就有必要了解Java对象在JVM中到底是如何存储的。我们知道JVM中在方法区存储对象的引用,在堆中存储的对象实例。那么堆中存储的对象又有那些信息哪?其实堆中存储的对象主要由三部分组成,对象头,实例字段数据以及padding。对象头里面存储了指向方法区元数据的引用,实例字段数据就是存储了实际的字段数据,padding主要是为了补位,实例对象在堆中存储的时候必须是八字节的整数倍,不够的时候由padding占位补齐。
对象头中的数据有具体分为Mark World,Class Metadata Address以及Array Length
轻量级锁的加锁过程:
线程在获取轻量级锁失败的时候会进行自旋,如果不加以限制会对CPU资源造成较多的消耗,所以自旋一定的次数之后会升级成重量级锁。
我们知道Java中每个对象都会有一个对象监视器(Object Monitor, 即管程),而升级为重量级锁就需要用到这个Object Monitor。它会有一个owner用来标记这个锁被谁占用了,还有一个entry list用来存储未获得锁的线程,entry list中的线程都是blocked状态。假设两个线程T1,T2同时去获取重量级锁,如果T1获取到了锁,那么owner就会指向T1,而T2就会进入entry list进行等待,从而减少对CPU的消耗。
在JDK6以后,默认已经开启了偏向锁这个优化,可以通过JVM参数 -XX:-UseBiasedLocking来禁用偏向锁。若偏向锁开启,只有一个线程抢锁,可获取偏向锁。偏向锁会偏向于第一个获得它的线程,如果在接下来的执行过程中,该锁没有被其他的线程获取,则持有偏向锁的线程将永远不需要同步。大多数情况下,锁不仅不存在多线程竞争,而且总是由同一线程多次获得,为了让线程获得锁的代价更低而引入了偏向锁。当锁对象第一次被线程获取的时候,线程使用CAS操作把这个线程的ID记录在对象Mark Word之中,同时置偏向标志位1。以后该线程在进入和退出同步块时不需要进行CAS操作来加锁和解锁,只需要简单地测试一下对象头的Mark Word里是否存储着指向当前线程的ID。如果测试成功,表示线程已经获得了锁。当有另外一个线程去尝试获取这个锁时,偏向模式就宣告结束。根据锁对象目前是否处于被锁定的状态,撤销偏向后恢复到未锁定或轻量级锁定状态。
标签:ros rcv roi important record i++ 栈帧 down 可见
原文地址:https://www.cnblogs.com/coding-diary/p/11235047.html