【并发设计模式】聊聊Balking是如何实现以及具体原理
2023-12-31 18:34:12
前面的等待唤醒,其实是一个线程等待执行满足条件的逻辑,会一直死等,但是并不是全部的场景都需要死等。比如我们去坐车的时候,公交一直没来,那么就可以不去了。而等待唤醒是公交没来我就等他来了再去。
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);
//业务逻辑
}
}
文章来源:https://blog.csdn.net/jia970426/article/details/135317656
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!