设计模式
设计模式之单例模式概念定义1234567定义:单例模式是指某一个类运行过程中只有一个实例产生,且由这个类自己产生,然后对外提供一个可以访问他的全局访问方法。作用:提供唯一一个实例,避免资源的抢夺。常见于以下的场景中: * 资源共享:单例模式可以用于管理共享的系统资源,例如数据库连接池、线程池或缓存。通过使用单例模式,可以确保只有一个实例存在,从而避免资源竞争和浪费。 * 配置信息:当你需要在应用程序中保存全局配置信息时,可以使用单例模式。单例对象可以加载配置文件或从数据库中读取配置信息,并在应用程序的其他部分提供访问。 * 日志记录器:在日志记录器中使用单例模式可以确保在整个应用程序中只有一个日志记录器实例。这样可以避免创建多个日志记录器对象,并统一管理日志的写入和输出。 * 对象缓存:单例模式可以用于实现对象的缓存。当你需要频繁创建和销毁对象,并希望在创建对象时重用已有对象时,可以使用单例模式来实现对象的缓存功能。
实现方式之概述单例模式有很多种的实现方式,这里仅介绍:饿汉式、懒汉式、双重检查锁单例模式、枚举单例模式。详情如下:
饿汉式:实例创建时机在类加 ...
设计模式之策略模式
设计模式之策略模式概念定义1234567891011121314菜鸟教程定义:一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。个人理解:就是为多种可能出现的情况,去制定不同的策略,情况一用策略一解决,情况二用策略二解决......策略模式适用于以下场景:1. 多种算法或行为:当存在多个算法或行为可供选择,并且客户端需要在运行时动态选择其中一种算法或行为时,可以使用策略模式。这样可以避免使用大量的条件语句来判断不同的情况。2. 需要扩展和维护性:当系统需要添加新的算法或行为时,使用策略模式可以简化扩展的过程。每个算法或行为都被封装在独立的策略类中,新增一个策略类即可,符合开闭原则。3. 避免代码重复:当多个类具有相似的行为,但实现方式不同,使用策略模式可以避免代码重复。可以将相同的行为抽象成策略类,每个类实现自己的具体行为。4. 条件复杂性:当业务逻辑中存在复杂的条件语句,使用策略模式可以将这些条件逻辑分离出来,使得代码更加清晰和可维护。一些常见的应用场景包括:- 订单优惠策略:不同的订单可能有不同的优惠策略,可以使用策略模式将各种优惠策略封装成不同的策略类,并在 ...
多线程与高并发五之 ReentrantLock篇
多线程与高并发五之 ReentrantLock篇一、前言ReentrantLock 是基于 AQS 实现的同步框架,关于 AQS 的源码在 这篇文章 已经讲解过,ReentrantLock 的主要实现都依赖AQS,因此在阅读本文前应该先了解 AQS 机制。本文并不关注 ReentrantLock 如何使用,只叙述其具体实现。
二、ReentrantLock 的继承体系以及特点AQS 是基于模板方法模式设计的,理解该设计模式可以帮助阅读 ReentrantLock 源码,当然不熟悉该设计模式并不影响下文的阅读。首先我们来看 ReentrantLock 的类结构,该类实现了 Lock 接口,该接口定义了一些需要实现的方法,这些方法是提供给应用程序员编写并发程序使用时的 API。ReentrantLock 如何提供这些 API的支持则依赖 AQS 框架,在其内部定义了一个类 Sync ,在 AQS 一文中提到过要使用 AQS 构建同步工具,主要是实现自己的 tryAccquire 和 tryRealease 方法,Sync 类即是 AQS 的模板方法具体实现,对加锁解锁方法进行了重新实现,但 ...
多线程与高并发四之Java中断机制
多线程与高并发四之Java中断机制前言我们首先介绍中断的三个 APPI 及其底层代码,在对方法的实现有了清晰的认知后,再结合场景谈谈什么是中断,以及中断该如何正确使用?
一、中断方法1. isInterrupted1234public boolean isInterrupted() { // 调用isInterrupted 方法,中断标记设置为 true return isInterrupted(false); }
这个方法很简单,就是返回当前线程的中断标记值,这个方法是由 native 方法实现。
123456/** * Tests if some Thread has been interrupted. The interrupted state * is reset or not based on the value of ClearInterrupted that is * passed. */ private native boolean isInterrupted(boolean C ...
多线程与高并发三之AQS 原理探索
多线程与高并发三之AQS 原理探索一、前言AQS 是一个同步框架,关于同步在操作系统篇 中对进程同步做了些概念性的介绍,我们了解到进程(线程同理,本文基于 JVM 讲解,故下文只称线程)同步的工具有很多:Mutex、Semaphore、Monitor。但是Mutex 和 Semaphore 作为低级通信存在不少缺点,Monitor 机制解决了上面部分缺憾,但是仍然存在问题,AQS 的出现很好的解决了这些问题。
二、其他同步工具的缺点Mutex
Mutex 只有两种状态,锁定和非锁定,无法表示临界区的可用资源数量(计数信号量可解决)。
使用复杂,使用不当易造成死锁
Semaphore
Mutex 只允许一个线程访问临界资源, Semaphore 允许一定数量的线程访问共享资源。但是 Semaphore 中没有 Owner,无法知道当前获取锁的线程是谁。
使用复杂,使用不当易造成死锁,P V 操作需要配对使用,分散在代码各处增大了编码难度。
MonitorMonitor 解决了上述几个问题,但在 HotSpot 中底层是基于 Mutex 做的线程同步,在 1.6 之前且还没有进行优化, ...
操作系统初步整理
操作系统初步整理前言下一篇章打算讲解 AQS ,在去熟悉 AQS 原理之前,我想我们得知道一个事物是因何而产生,它出现的动机;AQS 作为一种高级的同步机制,讨论 AQS 则避免不了谈及操作系统以及 Java 实现的其他同步机制,正是因为其他同步机制存在一些缺陷或是限制才会有 AQS;由于同步机制的篇幅并不短,因此单独开一文进行阐述。
概念介绍临界区
Consider a system consisting of n processes {P0, P1, …, Pn−1}. Each process has a segment of code, called a critical section, in which the process may be accessing — and updating — data that is shared with at least one other process.
当多个进程访问(包含线程,此文以进程来讲解,后续只说进程)共享资源时,这些进程访问共享资源的代码就称作临界区。临界区的关键是在同一时刻只能有一个进程执行临界区。
临界资源在同一 ...
多线程与高并发二之Synchronized加锁解锁篇
多线程与高并发二之Synchronized加锁解锁篇前言上篇主要对 Synchronized 的锁实现原理 Monitor 机制进行了介绍,由于 Monitor 基于操作系统调用,上下文切换导致开销大,在竞争不激烈时性能不算很好, 在 jdk6 之后进了系列优化。前文对优化措施进行了简单介绍,下面将一一介绍这些优化的细节,行文思路大致如下:
从重量级锁的优化开始讲,一是自旋锁,二是尽量避免进入 Monitor ,即使用轻量级锁
讲解轻量级锁及加锁解锁流程
轻量级锁在没有竞争时,每次重入仍然需要执行cas操作,为解决这个问题,因而产生了偏向锁
详细介绍偏向锁
Synchronized 锁的细节一、自旋锁自旋锁比较简单,逻辑在上篇也已经进行过阐述,这一篇章我们着重看下它的性能如何?在竞争度较小的时候,重量级锁的上下文切换导致的开销相对于 CPU 处理任务的时间占比较重,此种情况下,自旋锁的性能有优势,因自旋而导致的 CPU 浪费在可接受范围内;当竞争激烈的时候,继续使用自旋锁则得不偿失,性能上比直接使用重量级锁要差,大量的等待锁的时间被浪费。根据任务处理时间不同,自旋锁表现也不一,在任 ...
多线程与高并发一之Synchronized理解篇
多线程与高并发一之Synchronized理解篇一、 什么是锁?在多线程中,多个线程同时对某一个资源进行访问,容易出现数据不一致问题,为保证并发安全,通常会采取线程互斥的手段对线程进行访问限制,这个互斥的手段就可以称为锁。锁的本质是状态+指针,当一个线程进入临界区前需要先修改状态,表明已加锁,并且指针指向加锁的线程。后续线程在进入临界区时同样需要尝试修改状态,修改状态前首先检查指针是否为空,如果不为空且指向其他线程则表明已经有其他线程占用了锁,则无法进行状态修改,也就是此线程获取锁失败。
二、 Synchronized 锁原理Synchronized 关键字如何实现同步互斥?一、生成字节码首先了解 Synchronized 的三种用法:
锁对象实例
锁方法实例以上三种不同的使用方式,JVM 生成的字节码也不同,具体如下:
锁对象实例12Synchronized(this) {}
通过 反编译生成的字节码可看到,生成了字节码指令 monitorenter 和 monitorexit;当代码执行到monitorenter时加锁,执行monitorexit时解锁。E ...
动态SQL
05、动态SQLMybatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能,它存在的意义是为了解决拼接SQL语句字符串时的痛点问题。
1、ifif标签可通过test属性的表达式进行判断,若表达式的结果为true,则标签中的内容会执行;反之标签中 的内容不会执行
12345678910111213<!--List<Emp> getEmpListByMoreTJ(Emp emp);--><select id="getEmpListByMoreTJ" resultType="Emp"> select * from t_emp where 1=1 <if test="ename != '' and ename != null"> and ename = #{ename} </if> <if test="age != '' and age != n ...
MyBatis简介
1、MyBatis简介1、MyBatis历史MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁 移到了Google Code。随着开发团队转投Google Code旗下, iBatis3.x正式更名为MyBatis。代码于 2013年11月迁移到Github。
iBatis一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。 iBatis提供的持久层框架 包括SQL Maps和Data Access Objects(DAO)。
2、MyBatis特性
MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架
MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集
MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录
MyBatis 是一个 半自动的ORM(Object Relation Mapping ...