我就是厕所所长

yield

线程稍微i让一下

join

t2线程join到t1,则先把t2运行完,t1才能接着运行

notify

不释放锁

await

会自动释放锁

ThredStatu

选区_113.png

Ready状态

相当于线程都在一个线程池内等待cpu调用

Running

cpu正在执行的线程

Thread.yield

synchronized 可重入锁

可重入:一个同步方法可以调用另外一个同步方法,一个线程已经拥有某个对象的锁,再次申请的时候仍然会得到该对象的锁.

hotspot实现

是根据对象字节的前面两位来记录锁信息
哪个线程拥有这把锁(线程id):当下次这个线程在来到锁这边时,就直接让它过去了,如果是另一个线程过来,XX发现线程id不一样,就升级为自选锁(自旋十次之后还没拿到,升级(wait)为重量级锁,进入等待队列里)
锁类型

  1. public synchronized static void m() { //这里等同于synchronized(FineCoarseLock.class)
  2. count--;
  3. System.out.println(Thread.currentThread().getName() + " count = " + count);
  4. }

程序在执行过程中,如果出现异常,默认情况锁会被释放

所以,在并发处理的过程中,有异常要多加小心,不然可能会发生不一致的情况。

偏向锁

markword 记录这个线程ID

自选锁

如果线程争用:升级为 自旋锁,10次以后升级为系统锁
占用CPU
执行时间短(加锁代码),线程数少,用自旋

系统锁(重量级锁)

不占用CPU
执行时间长,线程数多,用系统锁
_