锁的八个问题演示

  1. class Phone {
  2. public static synchronized void sendSMS() throws Exception {
  3. //停留 4 秒
  4. TimeUnit.SECONDS.sleep(4);
  5. System.out.println("------sendSMS");
  6. }
  7. public synchronized void sendEmail() throws Exception {
  8. System.out.println("------sendEmail");
  9. }
  10. public void getHello() {
  11. System.out.println("------getHello");
  12. }
  13. }
  • 对于普通同步方法,锁是当前实例对象
  • 对于静态同步方法,锁是当前类的 Class 对象
  • 对于同步方法块,锁是 Synchonized 括号里配置的对象

公平锁和非公平锁

  • 对于ReentrantLock可以通过构造函数,传入是否公平的标志,来实现公平锁
  • 公平锁实现类中多了一个hasQueuedPredecessors的判断

死锁

  • 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程
  • 可通过Jstack命令进行检测

可重入锁

  • 什么是 “可重入“,可重入就是说某个线程已经获得某个锁,可以再次获取锁而不会出现死锁
  • synchronizedReentrantLock都属于可重入锁