java多线程锁

87 阅读1分钟

概述

多线程锁 (公平锁和非公平锁,死锁,可重锁) 某一个时刻内,只能有唯一一个线程去访问这些synchronized 方法

所有的 静态同步方法用的也是同一把锁 ——类对象本身,这两把锁是两个不同的对象,所以静态同步方法与非静态同步方法之间是不会有竞态条件的,但是一旦一个静态同步方法获取锁后,其他的静态同步方法都必须等待该方法释放锁后才能获取锁,而不管是同一个实例对象的静态同步方法之间,还是不同的实例对象的静态同步方法之间,只要它们同一个类的实例对象

synchronized 锁的是方法,则是对象锁,同个对象锁的机制要等待,不同对象锁的机制调用同一个不用等待

加了static则为class锁而不是对象锁

对于同步方法块,锁是 synchronized 括号里配置对象

公平锁和非公平锁

  • 公平锁:效率相对低 ,但是cpu 的利用高了
  • 非公平锁:效率高,但是线程容易饿死(所有的工作,有一个线程完成)

可重入锁

synchronized和lock都是可重入锁

  • sychronized是隐式锁,不用手工上锁与解锁,而lock为显示锁,需要手工上锁与解锁
  • 可重入锁也叫递归锁

死锁

两个或以上的进程因为争夺资源而造成互相等待资源的现象称为死锁

产生死锁的原因:

  1. 系统资源不足
  2. 系统资源分配不当
  3. 进程运行顺序不当