synchronized使用:
修饰实例方法,对当前实例对象this加锁
修饰静态方法,对当前类的Class对象加锁
修饰代码块,指定加锁对象,对给定对象加锁
java对象模型:对象头,实例数据(类加载在元空间的数据),对其填充(虚拟机要求对象起始地址必须是8字节的整数倍。方便运算)
对象头:类型指针和Mark Word 标记字段;类型指针指向元空间类的地址,标记字段表示存储对象自身的运行时数据
synchronized 在1.6以后升级出了锁升级的过程,以前是无锁和重量级锁;现在是从无锁,偏向性锁,轻量级锁,重量级锁
无锁就是指无锁的过程
偏向性锁主要针对一种情况你有一个资源,有一些线程去申请了这个锁一些指的是一个,并且这个线程申请到了这个锁没有其他线程去争抢这个锁的时候当它指向同步代码块的时候就没有必要去释放这个锁了,因为释放锁的过程需要从用户态转换成内核态,这个过程十分消耗资源
从偏量级升级轻量级锁过程,现在是两个线程去争夺资源,那么这个轻量级锁就会升级到轻量级,抢占资源时候去判断如果申请不到线程就会进入自旋状态自选的时候还会判断能不能申请到资源还不能获取到锁就会进入重量级锁
轻量级锁采用的CAS原理,比较并转换这个机制,
CAS是一种无锁思想,线程对变量做修改操作时会比较内存中原来存的值是否与预期值相同,相同的时候说明这个值没有改过,没有冲突,再对其修改,不相等这个线程就开始自选,自选一定次数不达到期望则放弃操作 ABA问题修改两次
就是重量级锁 就是 完全阻塞了