底层原理:
Synchronized通过编译,会在同步块的前后分别形成monitorenter和monitorexit这个两个字节码指令。
1)在执行monitorenter指令时,首先要尝试获取对象锁。如果这个对象没被锁定,或者当前线程已经拥有了那个对象锁,把锁的计算器加1
2)相应的,在执行monitorexit指令时会将锁计算器减1,当计算器为0时,锁就被释放了
3)如果获取对象锁失败,那当前线程就要阻塞,直到对象锁被另一个线程释放为止。
sychronized是重量级锁:同一时刻有多个线程竞争同一把锁
当多个线程竞争同一把锁时,竞争失败的线程会被阻塞。直到只有锁的线程将锁释放后再次唤醒阻塞的线程
慢的原因:
线程的唤醒和阻塞是一个很耗费CPU资源的操作
优化:
使用自旋锁来获取重量级锁,线程未获得锁后,不是一味地阻塞,而是让线程通过循环不断尝试获取锁
自旋锁的缺点:
若线程占用锁的时间过长,导致CPU资源拜拜浪费