Java Synchronized 使用相关

final

String

枚举类型

Number: Integer Long

 

  • Synchronized可以作用在哪里? 分别通过对象锁和类锁进行举例。
  • Synchronized本质上是通过什么保证线程安全的? 分三个方面回答:加锁和释放锁的原理,可重入原理,保证可见性原理。
  • Synchronized有什么样的缺陷? Java Lock是怎么弥补这些缺陷的?
  • 锁的释放情况少,只有代码执行完毕或者异常结束才会释放锁;试图获取锁的时候不能设定超时,不能中断一个正在使用锁的线程,相对而言,Lock可以中断和设置超时。
  • 相对而言,Lock可以拿到状态,如果成功获取锁,….,如果获取失败
  • Synchronized和Lock的对比,如何选择?
  • Synchronized在使用时有何注意事项?
    • 使用Synchronized有哪些要注意的?
      • 锁对象不能为空,因为锁的信息都保存在对象头里
      • 作用域不宜过大,影响程序执行的速度,控制范围过大,编写代码也容易出错
      • 避免死锁
      • 在能选择的情况下,既不要用Lock也不要用synchronized关键字,用java.util.concurrent包中的各种各样的类,如果不用该包下的类,在满足业务的情况下,可以使用synchronized关键,因为代码量少,避免出错
    • synchronized是公平锁吗?
  • synchronized实际上是非公平的,新来的线程有可能立即获得监视器,而在等待区中等候已久的线程可能再次等待,这样有利于提高性能,但是也可能会导致饥饿现象。
  • Synchronized修饰的方法在抛出异常时,会释放锁吗?
  • 多个线程等待同一个Synchronized锁的时候,JVM如何选择下一个获取锁的线程?
  • Synchronized使得同时只有一个线程可以执行,性能比较差,有什么提升的方法?
  • 我想更加灵活的控制锁的释放和获取(现在释放锁和获取锁的时机都被规定死了),怎么办?
  • 什么是锁的升级和降级? 什么是JVM里的偏斜锁、轻量级锁、重量级锁?
  • 不同的JDK中对Synchronized有何优化?

Synchronized的使用

发表回复