logo头像

Always believe youself.

并发编程-4

Park&Unpark

image.png

Park 的状态就是 wait ,无限的等待。

unpark 既可以在 park 之前也可以在 unpark 之后调用。

如果先 unpark 了, 再调用 park 不会在等待。

image.png

park&unpark 原理

java 层面看不到,c++ 实现的。

image.png

image.png

image.png

image.png

线程状态转换

企业咚咚20210826202909.jpg

image.png

image.png

image.png

image.png

多把锁

image.png

image.png

活跃性

死锁

image.png

定位死锁:可以使用 jconsole 工具,或者使用 jps 定位 进程 id,在用 jstack 定位死锁。

image.png

活锁

image.png

饥饿

image.png

ReentrantLock

image.png

可以反复加锁。

基本语法

1
2
3
4
5
6
7
reentrantLock.lock()
try{
//临界区
}finally{
// 释放区
reentrantLock.unlock();
}

可重入

是指同一个线程如果首次获得了这把锁,那么因为它是这把锁的拥有者,因此有权利再次获得这把锁。

如果是不可重入锁,那么第二次获得锁时,自己也会被锁挡住。

可打断

在等待时 可以用 interapet 打断。

1
2
3
4
5
ReentrantLock lock = new ReentrantLock();

lock.lock() //是不能打断的

lock.lockInterruptibly() //是可以打断的

锁超时

1
2
3
4
5
6
7
ReentrantLock lock = new ReentrantLock();

// 可打断
lock.tryLock() //尝试获取锁,立即返回

lock.tryLock(n,时间单位) //在时间内尝试获取锁
lock.unlock()

解决科学家就餐问题

旧版本 synchronized 拿不到锁,一直等待

image.png

新版本 lock.tryLock()

image.png

筷子既是筷子,也可以当作锁来进行使用。

image.png

公平锁

synchroized 是公平锁的

ReentrantLock 默认是不公平的,不公平的是进行争抢的,改为公平的则是先进先获得锁。

image.png

公平锁一般没有必要,会降低并发度。

条件变量

image.png

同步模式之顺序控制

先打印 2 再打印 1

  • synchroized 实现

image.png

  • reentrantLock 实现 awit 和唤醒
  • park&unpark

image.png

设计模式,交替输出

  • 方法一

image.png

image.png

  • 方法二 reentrantLock

    image.png

  • 方法三 park

image.png

总结

image.png

image.png