- synchronized关键字的使用方法?
- 修饰实例方法:作用于当前对象实例加锁,进入同步代码前要获得 当前对象实例的锁。
- 修饰静态方法: 也就是给当前类加锁,会作用于类的所有对象实例 ,进入同步代码前要获得 当前 class 的锁。
- 修饰代码块 :给括号内配置的对象加锁。synchronized(this|object) 表示进入同步代码库前要获得给定对象的锁。synchronized(类.class) 表示进入同步代码前要获得 当前 class 的锁。
- 说说自己对于synchronized关键字的了解?
synchronized关键字用于解决多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。
- JDK1.6之前,synchronized属于重量级锁,效率低下。
- JDK1.6之后,Java官方从JVM层面对synchronized关键字进行了较大的优化,效率不可同日而语。主要的优化有:自旋锁、适应性自旋锁、锁消除、锁粗化、偏向锁、轻量级锁等技术来减少锁操作的开销。
锁主要存在的四种状态,依次是:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态,他们会随着竞争的激烈而逐渐升级。注意锁可以升级不可降级,这种策略是为了提高获得锁和释放锁的效率。
- Lock锁和synchronized锁的区别?
- Lock锁是对象,而synchronized是java关键字
- Lock锁需要手动加锁释放锁,synchronized的该操作是全自动的。对于异常前者需要手动释放锁,不然容易导致死锁。而后者由jvm自动管理。
- Lock锁的属性可以配置,而synchronized只能是可重入的、非公平的、不可中断的。
- 在实现原理上synchronized主要是基于对象的monitor。而Lock的实现是java层面的,基础是AQS
- 什么是死锁?
两个或两个线程在执行过程中,由于竞争资源或者由于彼此等待而造成的线程阻塞,线程不在下进行
- 死锁的条件
死锁的四个必要条件:
- 互斥条件:进程对所分配到的资源不允许其他进程进行访问,若其他进程访问该资源,只能等待,直至占有该资源的进程使用完成后释放该资源
- 请求和保持条件:进程获得一定的资源之后,又对其他资源发出请求,但是该资源可能被其他进程占有,此事请求阻塞,但又对自己获得的资源保持不放
- 不可剥夺条件:是指进程已获得的资源,在未完成使用之前,不可被剥夺,只能在使用完后自己释放
- 环路等待条件:是指进程发生死锁后,若干进程之间形成一种头尾相接的循环等待资源关系
- 避免死锁的方法?
- 固定加锁的顺序(针对锁顺序死锁)
- 开放调用(针对对象之间协作造成的死锁)
- 使用定时锁–>tryLock()
- 如果等待获取锁时间超时,则抛出异常而不是一直等待!
分析排查死锁的方法:
- 图形化分析工具: jvisualvm
- 命令行分析: jps jcmd
- 命令行分析 jps jstack