【并发设计模式】聊聊Balking是如何实现以及具体原理

前面的等待唤醒,其实是一个线程等待执行满足条件的逻辑,会一直死等,但是并不是全部的场景都需要死等。比如我们去坐车的时候,公交一直没来,那么就可以不去了。而等待唤醒是公交没来我就等他来了再去。

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);
        //业务逻辑
    }

}

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-06 08:50:06       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-06 08:50:06       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-06 08:50:06       87 阅读
  4. Python语言-面向对象

    2024-01-06 08:50:06       96 阅读

热门阅读

  1. 代码设计模式

    2024-01-06 08:50:06       60 阅读
  2. 设计模式之单例模式

    2024-01-06 08:50:06       63 阅读
  3. Hive 源码

    2024-01-06 08:50:06       54 阅读
  4. 搭建网站环境(IIS+php+mysql)

    2024-01-06 08:50:06       52 阅读
  5. Websocket实时更新商品信息

    2024-01-06 08:50:06       50 阅读
  6. Spring Boot和Spring主要区别:

    2024-01-06 08:50:06       60 阅读
  7. k8s-二进制部署

    2024-01-06 08:50:06       51 阅读
  8. Ubuntu20.04安装suiteCRM

    2024-01-06 08:50:06       56 阅读
  9. 使用conda管理Python虚拟环境

    2024-01-06 08:50:06       61 阅读
  10. conda

    conda

    2024-01-06 08:50:06      58 阅读
  11. conda创建、查看、删除虚拟环境

    2024-01-06 08:50:06       57 阅读
  12. 从0开始的编程生活

    2024-01-06 08:50:06       54 阅读
  13. Sentinel 使用

    2024-01-06 08:50:06       52 阅读