首页 > 编程语言 >【设计模式】模板方法模式——模板方法模式在JDK源码中的应用

【设计模式】模板方法模式——模板方法模式在JDK源码中的应用

时间:2024-01-10 19:01:17浏览次数:31  
标签:return int boolean 源码 arg protected 设计模式 final 模板

模板方法模式在JDK源码里最典型的实现就是AQS


AbstractQueuedSynchronizer

AQS(AbstractQueuedSynchronizer)的部分代码如下:

public abstract class AbstractQueuedSynchronizer
    extends AbstractOwnableSynchronizer
    implements java.io.Serializable {
    
    // ……代码省略……
    
    public final void acquire(int arg) {
        if (!tryAcquire(arg) &&
            acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
            selfInterrupt();
    }
    
    public final boolean release(int arg) {
        if (tryRelease(arg)) {
            Node h = head;
            if (h != null && h.waitStatus != 0)
                unparkSuccessor(h);
            return true;
        }
        return false;
    }
    
    // ……代码省略……
    
	protected boolean tryAcquire(int arg) {
        throw new UnsupportedOperationException();
    }

    protected boolean tryRelease(int arg) {
        throw new UnsupportedOperationException();
    }
    
    // ……代码省略……
    
}

ReentrantLock关于AQS两个抽象方法的实现:

public class ReentrantLock implements Lock, java.io.Serializable {

    // ……代码省略……
    
    abstract static class Sync extends AbstractQueuedSynchronizer {
        private static final long serialVersionUID = -5179523762034025860L;

        @ReservedStackAccess
        protected final boolean tryRelease(int releases) {
            int c = getState() - releases;
            if (Thread.currentThread() != getExclusiveOwnerThread())
                throw new IllegalMonitorStateException();
            boolean free = false;
            if (c == 0) {
                free = true;
                setExclusiveOwnerThread(null);
            }
            setState(c);
            return free;
        }
    }

    /**
     * Sync object for non-fair locks
     */
    static final class NonfairSync extends Sync {
        protected final boolean tryAcquire(int acquires) {
            return nonfairTryAcquire(acquires);
        }
    }

    /**
     * Sync object for fair locks
     */
    static final class FairSync extends Sync {
        @ReservedStackAccess
        protected final boolean tryAcquire(int acquires) {
            final Thread current = Thread.currentThread();
            int c = getState();
            if (c == 0) {
                if (!hasQueuedPredecessors() &&
                    compareAndSetState(0, acquires)) {
                    setExclusiveOwnerThread(current);
                    return true;
                }
            }
            else if (current == getExclusiveOwnerThread()) {
                int nextc = c + acquires;
                if (nextc < 0)
                    throw new Error("Maximum lock count exceeded");
                setState(nextc);
                return true;
            }
            return false;
        }
    }

    // ……代码省略……
}

注意acquire()和release()方法用final关键字修饰,不可修改,而tryAcquire()和tryRelease()这两个用protected关键词修饰的方法则直接抛了异常,所以它们必须由子类去实现。acquire()和release()方法定义了一个统一的结构,差异化的tryAcquire()和tryRelease()方法需要具体的子类去实现功能,实现了模板方法模式。

模板方法模式在很多框架中也有应用,比如Junit 单元测试啦、HttpSerlvet 中关于 doGet()、doPost() 等方法的调用啦、Spring 中 JDBCTemplate啦等等。




标签:return,int,boolean,源码,arg,protected,设计模式,final,模板
From: https://blog.51cto.com/dongfeng9ge/9184275

相关文章

  • ? 开源即时通讯(IM)项目OpenIM源码部署指南
    OpenIM的部署涉及多个组件,并支持多种方式,包括源码、Docker和Kubernetes等。这要求在确保不同部署方式之间的兼容性同时,还需有效管理各版本之间的差异。确实,这些都是复杂的问题,涉及到深入的技术细节和精准的系统配置。我们的目标是简化部署流程,同时保持系统的灵活性和稳定性,以适应不......
  • PyTorch项目源码学习(2)——Tensor代码结构初步学习
    PyTorch版本:1.10.0TensorTensor是Pytorch项目较为重要的一部分,其中的主要功能如存储,运算由C++和CUDA实现,本文主要从前端开始探索学习Tensor的代码结构。结构探索PyTorch前端位于torch目录下,从_tensor.py可以找到Tensor的python定义,可以看到其继承自torch._C._Tensorbase而Te......
  • C++设计模式05 —— 装饰模式
    装饰模式过度的使用继承使得派生的子类过多,代码重复度很高,复用性变差。实现加密文件流、加密网络流、加密内存流、缓冲文件流、缓冲网络流、缓冲内存流。如果我们创建一个流基类,然后创建文件流继承流基类,最后创建加密文件流继承文件流、创建缓冲文件流继承文件流。如果这......
  • SpringBoot中使用单例模式+ScheduledExecutorService实现异步多线程任务(若依源码学习
    场景若依前后端分离版手把手教你本地搭建环境并运行项目:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108465662设计模式-单例模式-饿汉式单例模式、懒汉式单例模式、静态内部类在Java中的使用示例:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/......
  • C++设计模式04 —— 观察者模式
    观察者模式一种一对多的依赖关系,当被依赖的对象发生改变时,所有依赖它的对象都能够做出相应的改变。为一个文件分割器加入进度展示。我们需要支持多个类型的进度条,我们可以随意操控进度条的样式细节。首先,我们做一个进度条的抽象基类classIProgress{public:virtu......
  • 仿冒转转闲鱼钓鱼链接源码 闲鱼转转链接后台源码
    转转闲鱼交易猫三合一链接源码搭建教程:导入数据库,修改数据库config/conn.php1、一键生成链接卡框分享,效果逼真2、使用简单,支持自定义订单内容。3、输入相应内容,上传商品图片,快速生成链接一键分享转发下载源码:https://pan.baidu.com/s/1ytoKFN0gdcqJoJCh5Pvg6w?pwd=duke ......
  • 药品不良反应智能监测系统源码,ADR智能监测系统全套源码,
    ADR智能监测系统全套源码,药品不良反应智能监测系统源码ADR智能监测上报系统是基于医院临床数据中心而建立,运用信息技术实现药品不良反应的智能监测、报告管理、知识库查询、统计分析等功能。药品不良反应智能监测系统自动提取不良反应报告数据,主动实时监测临床发生的不良反应,第一时......
  • Apache Doris 聚合函数源码阅读与解析|源码解读系列
    笔者最近由于工作需要开始调研ApacheDoris,通过阅读聚合函数代码切入ApacheDoris内核,同时也秉承着开源的精神,开发了array_agg函数并贡献给社区。笔者通过这篇文章记录下对源码的一些理解,同时也方便后面的新人更快速地上手源码开发。聚合函数,顾名思义,即对一组数据执行聚合计算......
  • Java工地智慧云平台源码
    智慧工地云平台是一种基于云计算和物联网技术的解决方案,旨在提升工地管理的效率和安全性。它通过集成多种传感器、设备和软件系统,实现对工地各个环节的实时监控、数据采集和分析,从而实现对工地运营的全面管理和智能化决策。智慧工地利用移动互联、物联网、云计算、大数据等新一代......
  • 基于SpringBoot+Vue的流浪动物领养信息系统设计实现(源码+lw+部署文档+讲解等)
    (文章目录)前言:heartpulse:博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌:heartpulse:......