一文理解synchronized

  • synchronized 作为java中最早提供的同步锁解决方式,一直伴随着java的发展不断在优化。synchronized是如何优化的呢?
  • synchronized 通过锁的升级降级实现锁的优化。synchronized升级锁由低到高为:偏斜锁 - 轻量级锁-重量级锁。锁的升级导致的是性能主键降低,越来越重。
  • 偏斜锁:这是一种非常高效的锁,默认在没有竞争的情况下使用,即被锁对象生命周期内只被一个线程持有,没有另外的线程试图获取此对象。当一个线程持有一个对象的偏斜锁时,会在对象头加上一个线程id去标识。当另一个线程试图获取已经持有偏斜锁的对象时,那么锁升级为轻量级锁。
  • 轻量级锁:轻量级锁即通过CAS能够获取到锁,那么该锁就获取成功,成为一个持有轻量级锁的对象。如果通过CAS获取失败,则锁升级为重量级锁。
  • 重量级锁:这是使用同步机制进行锁定,当有另外的线程需要获取此时被锁定的重量级锁时,只能等待锁释放。同一时刻只有一个线程可以持有该对象锁,执行该对象的同步方法。这时称之为对象锁。
  • 如果在类上加锁,则持有的锁时类对象锁。那么同一时刻只有一个持有类对象锁的线程才能执行该类的所有方法。这就像是一个大箱子,类锁时大箱子上上锁,所以没有持有锁的线程对所有该箱子里的方法都不能执行。而对象锁就是一个大箱子里的小箱子,小箱子里锁住了该对象的同步方法,那么别的线程依然可以执行该对象的非同步方法,因为没有被锁。
  • 当然如果new 了一个新对象,则线程重新竞争,获得该对象锁的方法执行其同步方法,其他需要执行对象的同步方法的线程则等待执行。
  • 锁的降级认为是发生在jvm的安全点之上,在安全点检测monitor。synchronized的实现是在jvm里实现的,通过monitorenter 进入锁,monitorexit 退出锁。

你可能感兴趣的:(java,jvm)