ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 什么是synchronized ? 是Java中的关键字:用来修饰方法、对象实例。属于独占锁、悲观锁、可重入锁、非公平锁。 1. 作用于实例方法时,锁住的是对象的实例(this); 2. 当作用于静态方法时,锁住的是 Class类,相当于类的一个全局锁, 会锁所有调用该方法的线程; 3. synchronized 作用于一个非 NULL的对象实例时,锁住的是所有以该对象为锁的代码块。它有多个队列,当多个线程一起访问某个对象监视器的时候,对象监视器会将这些线程存储在不同的容器中。 ## synchronized 加锁原理? jdk 1.6 之前直接就是重量级锁:通过对象内部的监视器(monitor)实现,依赖于操作系统,线程需要争抢 monitor,抢到的就是加锁成功,没抢到的会放到队列中。涉及到阻塞同步,上下文切换,线程调度,操作系统的内核态和用户态的切换。消耗大,性能差。 jdk1.6 以后对synchronized锁进行了优化 内核态:当进程(线程)需要内核代码执行时,就是处于内核态。其他都是用户态。 ## synchronized 锁升级(锁膨胀)? 无锁 => 偏向锁 =》 自旋锁(轻量级锁) =》 重量级锁 当有线程加锁时,会在对象头中记录线程id,如果以后还是这个线程,则可以直接运行后续代码,当2个线程以上争抢加锁时,则直接升级为轻量级锁,CAS进行自旋加锁,当线程加锁竞争激烈,CAS自旋不成功(默认 10 次)则升级为重量级锁。 轻量级锁也被称为非阻塞同步、乐观锁 互斥锁(重量级锁)也称为阻塞同步、悲观锁 ### 可重入锁如果加了两把,但是只释放了一把会出现什么问题? 程序卡死,线程不能出来,也就是说我们申请了几把锁,就需要释放几把锁。 ### 如果只加了一把锁,释放两次会出现什么问题? 会报错,java.lang.IllegalMonitorStateException。