synchronized
锁的是对象不是代码
锁定方法和非锁定方法可以同时执行
synchronized(Object){
-不能用String常量 ,Integer ,Long 等基础数据类型
}
因为 万一你把一个类库的值锁住了,别人也锁住了 会出现死锁
锁升级--
偏向锁 :第一个 去访问某把锁的线程,是没有给Object加锁的,只记录这个线程的id
如果线程争用,升级为自旋锁 , 两个线程一个线程占着锁,另一个线程自旋
自旋锁:不会进入就绪队列,会一直占用cpu,自旋10次,如果还得不到这把锁,就升级为重量级锁
减少不必要的CPU上下文切换;在轻量级锁升级为重量级锁时,就使用了自旋加锁的方式
重量级锁:(不占cpu:意思就是 线程在等待队列里,等cpu调度)就是去操作系统(os)那里去申请资源
自旋锁(占cpu,但是不访问操作系统),所以他是用户态去解决这个锁的问题,不经过内核态,
因此在加锁和解锁的效率上比经过内核态的效率高
在什么情况下 用自旋锁最好:
执行时间短(加锁代码)线程数少,用自旋
执行时间长,线程数多,用系统锁
锁升级的概念:
就比如说你要锁定一个对象,在这个对象头上的某两位来指定他到底锁的是什么类型的锁,在对象头上
还记录着当前线程的id,哪个线程申请了这把锁
偏向锁的概念就是:先不尝试对他加锁,只是记录线程的id值,就认为这个对象是这个线程的独有,下次这个线程
再来申请这把锁的时候,判断如果还是原来那个线程,就别加锁了,直接访问 ,效率高一些
如果不是原来的线程,他会进行锁升级,首先会尝试着自旋锁的升级,自旋锁就是,如果有一个线程占有这把锁,
再来一个线程的时候,就会在旁边循环,他不在等待队列,会占用cpu, 自旋10次,如果还是拿不到这把锁,就继续升级为重量级锁,这哥们儿就
wait了,经过os 进入了等待队列,不占用cpu了