【多线程与高并发】1-线程与锁

线程概念

通俗来说,就是一个程序内不同的执行路径

线程生命周期



synchronized锁升级概念

sync(Object)

0.首先无锁状态(markword)00
1.记录markword(线程ID) 偏向锁 01
2.如果有线程争用,锁升级 自旋锁(轻量级锁-用户态,未经内核) 10
3.自旋10次之后,依然获取不到,锁升级 重量级锁 11

只能升级,无法降级

  • 执行时间短(加锁代码),线程数少,用自旋
  • 执行时间长,线程数多,用系统锁(重量级 11)
  • synchronized能保证原子性,但不能防止指令重排序

注意

  1. 锁的目标不能为Integer、Long等包装类型,因为Java的自动封箱和解箱操作会导致这些对象在经过运算后不再是原来的对象
  2. 不要以字符串常量作为锁定对象,因为在类库中代码也能锁定了字符串,程序和你用到的类库不经意间使用了同一把锁,这时就会发生死锁阻塞
  3. 锁定某对象o,如果o的属性发生改变,不影响锁的使用。但是如果o变成另外一个对象,则锁定的对象发生改变,应该避免将锁定对象的引用变成另外的对象

posted @ 2021-12-19 21:33  辽河老男孩  阅读(39)  评论(0)    收藏  举报