- 应用场景 用于同步代码块 多线程访问同一资源时的保护
- 当关键字在实例方法时,锁当前对象
- 当关键字在静态方法时,锁的是当前class
那么问题,来了这个class是惟一的吗?因为class是通过类加载器加载的,不同类加载器加载的class是不同的,但注意不同类加载器之间的class是不能互相访问的,因此我们能访问的class肯定是唯一的
- 可重入
当同一个线程对象访问两个都带锁的方法的时候,而这两个锁锁的是同一个对象,则两个方法可以互相调用不会有锁的互斥,同理父类子类的方法加锁,也满足可重入性
- 当发生异常 锁会被释放
同步代码块里面发生异常后,没有被try catch则当前锁会被释放
- synchronized的底层实现,当第一次访问这把锁的时候,此时为偏向锁,只是会记录当前线程的ID,实际并没有加锁
- 当偏向锁有其他线程来争用的时候,开始进行自旋,来争锁的线程并不会直接进入就绪队列,而是开始while循环(类似于过会就去看一下 所释放了没有),这种方式会耗费cpu资源,当转了10次之后,还是没有得到锁,则会升级为重量锁
- 重量锁每次访问都需要去操作系统那申请资源
- 自旋锁:线程数少 执行时间段短
- 重量级锁:线程数多 执行时间长