多线程相关知识点(二)

  1. 在 java 程序中怎么保证多线程的运行安全?
    (1)互斥同步(synchronized关键字)
    (2)Lock
    Java中确保线程安全最常用的两种方式

  2. 多线程锁的升级原理是什么?
    在Java中,锁共有4种状态,级别从低到高依次为:无状态锁,偏向锁,轻量级锁和重量级锁状态,这几个状态会随着竞争情况逐渐升级。锁可以升级但不能降级。
    Java锁性能提高(锁升级)机制总结

  3. 什么是死锁?
    死锁是指两个以上的线程永远阻塞的情况,这种情况产生至少需要两个以上的线程和两个以上的资源。

  4. 怎么避免死锁?
    (1)加锁顺序(线程按照一定的顺序加锁)
    (2) 加锁时限(线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁)
    (3)死锁检测

  5. ThreadLocal 是什么?有哪些使用场景?
    ThreadLocal用于创建线程的本地变量,我们知道一个对象的所有线程会共享它的全局变量,所以这些变量不是线程安全的,我们可以使用同步技术。但是当我们不想使用同步的时候,我们可以选择ThreadLocal变量。
    ThreadLocal的主要用途是为了保持线程自身对象和避免参数传递,主要适用场景是按线程多实例(每个线程对应一个实例)的对象的访问,并且这个对象很多地方都要用到。第一个例子:数据库连接;第二个例子:动态设置数据源
    ThreadLocal原理和适用场景

  6. synchronized 底层实现原理?
    任何一个对象都有一个Monitor与之关联,当且一个Monitor被持有后,它将处于锁定状态。Synchronized在JVM里的实现都是基于进入和退出Monitor对象来实现方法同步和代码块同步,虽然具体实现细节不一样,但是都可以通过成对的MonitorEnter和MonitorExit指令来实现。MonitorEnter指令插入在同步代码块的开始位置,当代码执行到该指令时,将会尝试获取该对象Monitor的所有权,即尝试获得该对象的锁,而monitorExit指令则插入在方法结束处和异常处,JVM保证每个MonitorEnter必须有对应的MonitorExit。
    实现原理

  7. synchronized 和 volatile 的区别是什么?
    (1)volatile只能作用于变量,使用范围较小。synchronized可以用在变量、方法、类、同步代码块等,使用范围比较广。
    (2)volatile只能保证可见性和有序性,不能保证原子性。而可见性、有序性、原子性synchronized都可以保证。
    (3)volatile不会造成线程阻塞。synchronized可能会造成线程阻塞。

  8. synchronized 和 Lock 有什么区别?
    多线程相关知识点(二)

  9. synchronized 和 ReentrantLock 区别是什么?
    ReenTrantLock可重入锁(和synchronized的区别)