java锁相关Synchronized 锁升级过程(原理,使用)

# Synchronized 使用-原理 ## 锁的概念 ![图片.png](https://cos.easydoc.net/31477061/files/km76sewj.png) ## Synchronized 是互斥锁(独占锁) ![图片.png](https://cos.easydoc.net/31477061/files/km75m778.png) ### 对象锁-类锁 ![图片.png](https://cos.easydoc.net/31477061/files/km75vvf4.png) - 加锁就是利用CAS的特性去修改this,那个线程修改成功就抢到了锁 ![图片.png](https://cos.easydoc.net/31477061/files/km765h6u.png) ## this - this 关键字用来表示当前对象本身,或当前类的一个实例,通过 this 可以调用本对象的所有方法和属性 ## 锁消除 一个线程 ![图片.png](https://cos.easydoc.net/31477061/files/km76mopl.png) ## 锁粗化 多个线程 ![图片.png](https://cos.easydoc.net/31477061/files/km76qkn1.png) ## notifyall notify() 方法随机唤醒对象的等待池中的一个线程,进入锁池-不公平锁,(公平锁:唤醒等待池的头部线程) notifyAll() 唤醒对象的等待池(等待队列)中的所有线程,进入锁池。 1.先加锁在挂起,2,先唤醒在挂起 ![image.png](https://cos.easydoc.net/31477061/files/kmbjezry.png) ## 锁升级 - 2个线程抢锁,当一个线程抢到了锁,另一个线程会不停的自旋,占用cpu资源,当自旋过一定次数,就会进行锁升级,从轻量级锁升到重量级锁。 - 重量级锁,会将没抢到锁的线程加入等待队列,等待被唤醒。 ## Synchronized 锁升级 解锁 ![图片.png](https://cos.easydoc.net/31477061/files/km92p0j9.png) ==Synchronized (对象)== - 对象在加锁之前有两种状态,未锁定就是没有加锁 1.开启偏向锁(未锁定) 2.关闭偏向锁(未锁定) ![图片.png](https://cos.easydoc.net/31477061/files/km92ydep.png) ## Synchronized / lock (优点-缺点) ![image.png](https://cos.easydoc.net/31477061/files/kmbkqgel.png)