前面的等待唤醒,其实是一个线程等待执行满足条件的逻辑,会一直死等,但是并不是全部的场景都需要死等。比如我们去坐车的时候,公交一直没来,那么就可以不去了。而等待唤醒是公交没来我就等他来了再去。
Guarded Suspension 模式会等待 if 条件为真,而 Balking 模式不会等待
这是二者之间本质的差别。
Balking模式是一种多个线程执行同一操作A时可以考虑的模式;说白了,就是多个人去买票,如果有人买到大家的票,剩余的人就可以不用在去买了。
可以通过使用syn、lock、cas、对于共享变量不要求原子性的场景,可以使用volatile 等方式实现。
在syn 从轻量级锁升级到重量级锁的时候,只有一个线程可以获取到锁。
单例模式也是这样。
private volatile static MacComputer instance;
/**
* 获取一个对象
* @return
*/
public static MacComputer getMac () {
if (Objects.isNull(instance)) {
synchronized (Objects.class) {
if (Objects.isNull(instance)) {
instance = new MacComputer();
}
}
}
return instance;
}
在实际开发中,我们可以对于初始化的方式进行使用这种方式
package com.jia.dp;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* @author qxlx
* @date 2023/12/31 5:16 PM
*/
public class BalkingTest {
private boolean inited = false;
//第一种方式 syn
public synchronized void init() {
if (!inited) {
return;
}
inited = true;
//业务逻辑
}
private Lock lock = new ReentrantLock();
//第二种方式 lock
public void init2() {
try {
lock.lock();
if (!inited) {
return;
}
inited = true;
//业务逻辑
} finally {
lock.unlock();
}
}
AtomicBoolean atomicBoolean = new AtomicBoolean(false);
//第三种方式 cas
public void init3() {
if (!atomicBoolean.get()) {
return;
}
atomicBoolean.compareAndSet(Boolean.FALSE, Boolean.TRUE);
//业务逻辑
}
}