-
【Java】 Iterator(迭代器)
摘要:一、Iterator介绍 Java Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法,可用于迭代 ArrayList 和 HashSet 等集合。 Iterator 是 Java 迭代器最简单的实现,ListIterator 是 Collection API 中的接口, 它扩展了
阅读全文
-
【Java多线程】ScheduledThreadPoolExecutor实现原理(二十九)
摘要:ScheduledThreadPoolExecutor,它是一个计划任务线程池,可以执行定时任务或者是计划任务。 ScheduledThreadPoolExecutor 继承了ThreadPoolExecutor,需要了解 ThreadPoolExecutor 的原理,参考:【Java多线程】线程池
阅读全文
-
【Java多线程】ScheduledThreadPoolExecutor详解(二十八)
摘要:ScheduledThreadPoolExecutor继承自ThreadPoolExecutor。它主要用来在给定的延迟之后运行任务,或者定期执行任务。ScheduledThreadPoolExecutor的功能与Timer类似,但ScheduledThreadPoolExecutor功能更强大、更
阅读全文
-
【Java多线程】Executor框架 (二十七)
摘要:一、Executor框架 在Java中,使用线程来异步执行任务。Java线程的创建与销毁需要一定的开销,如果我们为每一个任务创建一个新线程来执行,这些线程的创建与销毁将消耗大量的计算资源。同时,为每一个任务创建一个新线程来执行,这种策略可能会使处于高负荷状态的应用最终崩溃。 Java的线程既是工作单
阅读全文
-
【Java多线程】DelayQueue源码分析 (二十六)
摘要:阅读本文,请先了解PriorityQueue的使用(【Java】PriorityQueue 源码分析 ),以及AQS等 一、DelayQueue介绍 一个无限制的blocking queue的Delayed元素,其中元素只能在其延迟到期时才被使用。 队列的头是Delayed元素,其延迟期满后保存时间
阅读全文
-
【Java多线程】PriorityBlockingQueue源码分析 (二十五)
摘要:阅读本文前,请先了解AQS,阻塞队列,优先级队列,最小堆数据结构 参考:【Java多线程】队列同步器AQS(十一),【Java多线程】ArrayBlockingQueue阻塞队列原理分析(十六),【Java】PriorityQueue 的实现原理 一、PriorityBlockingQueue介绍
阅读全文
-
【Java】PriorityQueue 源码分析
摘要:一、PriorityQueue介绍 PriorityQueue 是基于优先级堆的无限优先级queue 。 优先级队列的元素根据它们的有序natural ordering ,或由一个Comparator在队列构造的时候提供,这取决于所使用的构造方法。 优先队列不允许null元素。 依靠自然排序的优先级
阅读全文
-
【Java多线程】SynchronousQueue源码分析(二十四)
摘要:原文连接:SynchronousQueue原理解析 源码解析 1、SynchronousQueue.java 1 public class SynchronousQueue<E> extends AbstractQueue<E> 2 implements BlockingQueue<E>, java
阅读全文
-
【Java多线程】线程最快累加方案(二十三)
摘要:线程最快累加方案 学习多线程期间,想了一个问题,多个线程累计时,怎样才能使计算又快又安全? 问题:一个初始值为0的变量,10个线程对其进行累计,一个线程对其累加 100_000_000 次,每次加2,请求结果及耗时短的方案? 四种方案,如下: 1 import java.util.concurren
阅读全文
-
【Java多线程】线程池ThreadPoolExecutor实现原理(二十二)
摘要:一、Java中的线程池 Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发过程中,合理地使用线程池能够带来3个好处。 第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 第二:提高响应速度。当任务到达时,任务可以不需要等到
阅读全文
-
【Java多线程】读写锁(ReadWriteLock)(二十一)
摘要:一、ReadWriteLock 读写锁在同一时刻可以允许多个读线程访问,但是在写线程访问时,所有的读线程和其他写线程均被阻塞。读写锁维护了一对锁,一个读锁和一个写锁,通过分离读锁和写锁,使得并发性相比一般的排他锁有了很大提升。 除了保证写操作对读操作的可见性以及并发性的提升之外,读写锁能够简化读写交
阅读全文
-
【Java多线程】ConcurrentHashMap 的实现原理(二十)
摘要:一、概述 本章使用的是JDK8。 阅读本章请先了解HashMap的实现原理【Java】HashMap 的实现原理 1.1 ConcurrentHashMap跟HashMap,HashTable的对比 1. HashMap不是线程安全: 在并发环境下,可能会形成环状链表(扩容时可能造成,具体原因自行百
阅读全文
-
【Java】HashMap 的实现原理
摘要:一、概述 本章使用的是JDK8。 二话不说,一上来就点开源码,发现里面有一段介绍如下: Hash table based implementation of the Map interface. This implementation provides all of the optional map
阅读全文
-
【Java】ArrayList 的实现原理
摘要:一、概述 本例使用的是JDK8. 一上来,先来看看源码中的这一段注释,我们可以从中提取到一些关键信息: Resizable-array implementation of the List interface. Implements all optional list operations, and
阅读全文
-
【设计模式】模版方法模式
摘要:模板方法模式 在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的实现与具体的环境相关。 例如,去银行办理业务一般要经过以下4个流程:取号、排队、办理具体业务、对银行工作人员进行评分等,
阅读全文
-
【Java多线程】Java中的13个原子操作类(十九)
摘要:一、Atomic包 当程序更新一个变量时,如果多线程同时更新这个变量,可能得到期望之外的值,比如变量i=1,A线程更新i+1,B线程也更新i+1,经过两个线程操作之后可能i不等于3,而是等于2。因为A和B线程在更新变量i的时候拿到的i都是1,这就是线程不安全的更新操作,通常我们会使用synchron
阅读全文
-
【数据结构】前缀(波兰表达式)、中缀、后缀表达式(逆波兰表达式)
摘要:一、中缀表达式 我们日常的运算表达式通常是如下形式,这种成为中缀表达式,也就是运算符在运算数的中间。这种表达式人类人容易识别,并根据其进行计算,但计算机识别这种表达式非常困难。 中缀表达式:(a + b) * c - d 中缀表达式的计算机求值:参考:【数据结构】栈,中的计算器应用部分 二、前缀表达
阅读全文
-
【数据结构】栈
摘要:一、栈的基本介绍 1.1 栈的基本性质 栈的英文为(stack) 栈是一个先入后出(FILO-First In Last Out)的有序列表 栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。 允许插入和删除的一端, 为变化的一端, 称为栈顶(Top), 另一端
阅读全文
-
【Java多线程】Java中的并发工具类(十八)
摘要:在JDK的并发包里提供了几个非常有用的并发工具类。CountDownLatch、CyclicBarrier 和 Semaphore 工具类提供了一种并发流程控制的手段。三个类的原理都是基于AQS。Exchanger工具类则提供了在线程见交换数据的一种手段。 一、等待多线程完成的CountDownLa
阅读全文
-
【设计模式】代理模式
摘要:一、定义 代理模式的定义:由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。 二、结构 代理模式的结构 代理模式的主要角色如下。 1)抽象主题(Subject)类:通过接口或抽象类声明真实主题和代理对象实现
阅读全文
-
【Java多线程】重入锁(ReentrantLock)(十七)
摘要:重入锁 重入锁ReentrantLock,顾名思义,就是支持重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁。除此之外,该锁的还支持获取锁时的公平和非公平性选择。 考虑如下场景:当一个线程调用Mutex的lock()方法获取锁之后,如果再次调用lock()方法,则该线程将会被自己所阻塞,原因是
阅读全文
-
【Java多线程】ArrayBlockingQueue阻塞队列原理分析(十六)
摘要:阅读此篇文章请先了解 AQS:【Java多线程】队列同步器AQS(十一) 阻塞队列:【Java多线程】Java中的阻塞队列(十五) 一、ArrayBlockingQueue介绍 ArrayBlockingQueue是一个用数组实现的有界阻塞队列。此队列按照先进先出(FIFO)的原则对元素进行排序。
阅读全文
-
【Java多线程】Java中的阻塞队列(十五)
摘要:什么是阻塞队列 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法。 支持阻塞的插入方法:意思是当队列满时,队列会阻塞插入元素的线程,直到队列不满。 支持阻塞的移除方法:意思是在队列为空时,获取元素的线程会等待队列变为非空。 阻塞队列常用于生
阅读全文
-
【Java多线程】自定义同步组件 - TwinsLock(十四)
摘要:前面章节(【Java多线程】队列同步器AQS(十一))中,对同步器AbstractQueuedSynchronized进行了实现层面的分析,本章通过编写一个自定义同步组件来加深对同步器的理解 同步组件要求 设计一个同步工具:该工具在同一时刻,只允许至多两个线程同时访问,这里显然是共享式访问将被组赛,
阅读全文
-
【Java多线程】LockSupport 工具 、Condition接口(十三)
摘要:一、LockSupport 工具 1.1 LockSupport 介绍 当需要阻塞或唤醒一个线程的时候,都会使用LockSupport工具类来完成相应工作。LockSupport定义了一组的公共静态方法,这些方法提供了基本的线程阻塞和唤醒功能,而LockSupport也成为构建同步组件的基础工具 L
阅读全文
-
【Java多线程】ReentrantLock锁原理分析(十二)
摘要:介绍了锁和AQS:【Java多线程】队列同步器AQS(十一),阅读此篇文章请先了解AQS 一、ReentrantLock介绍 ReentrantLock是可重入的独占锁,同时只能有一个线程可以获取这个锁,其他线程尝试获取就会被阻塞并放入AQS阻塞队列中, 类图结构如下: 二、原理分析 了解锁的基本原
阅读全文
-
【Java多线程】队列同步器AQS(十一)
摘要:一、Lock接口 Lock实现和synchronized关键字类似的同步功能,只是Lock在使用时需要显式地获取和释放锁,synchronized实现的隐式的获取所和释放锁。 虽然Lock它缺少了(通过synchronized块或者方法所提供的)隐式获取释放锁的便捷性,但是却拥有了锁获取与释放的可操
阅读全文
-
【Java多线程】并发包中ThreadLocalRandom类原理剖析(十)
摘要:并发包中ThreadLocalRandom类原理剖析 ThreadLocalRandom类是JDK7在JUC包下新增的随机数生成器,它解决了Random类在多线程下多个线程竞争内部唯一的原子性种子变量而导致大量线程自旋重试的不足。本节首先讲解下Random类的实现原理已经它在多线程下使用的局限性,然
阅读全文
-
【Java多线程】Thread类中interrupt()、interrupted() 和isInterrupted() 方法详解(九)
摘要:方法官方说明 interrupt()方法 其作用是中断此线程(此线程不一定是当前线程,而是指调用该方法的Thread实例所代表的线程),但实际上只是给线程设置一个中断标志,线程仍会继续运行。 interrupted()方法 作用是测试当前线程是否被中断(检查中断标志),返回一个boolean并清除中
阅读全文
-
【数据结构】双向链表
摘要:一、双向链表介绍 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表 双向链表图示 双向链表与单链表对比 1、单向链表,查找的方向只能是一个方向,而双
阅读全文
-
【数据结构】环形链表
摘要:一、约瑟夫问题介绍 Josephu 问题为:设编号为 1,2,… n 的 n 个人围坐一圈,约定编号为 k(1<=k<=n)的人从 1 开始报数,数 到 m 的那个人出列,它的下一位又从 1 开始报数,数到 m 的那个人又出列,依次类推,直到所有人出列为止,由 此产生一个出队编号的序列。 1.1 约
阅读全文
-
【设计模式】享元模式
摘要:享元模式 在面向对象程序设计过程中,有时会面临要创建大量相同或相似对象实例的问题。创建那么多的对象将会耗费很多的系统资源,它是系统性能提高的一个瓶颈。例如,围棋和五子棋中的黑白棋子,图像中的坐标点或颜色,局域网中的路由器、交换机和集线器,教室里的桌子和凳子等。这些对象有很多相似的地方,如果能把它们相
阅读全文
-
【数据结构】单向链表
摘要:一、链表的介绍 1、链表是以节点的方式来储存,是链式储存。 2、每个节点包含data域(存放数据)、next域(指向下一个节点)。 3、链表的各个节点不一定是连续储存的。 4、链表分为带头节点的链表和没有头节点的链表,根据实际的需求来确定。 二、带头节点单链表示意图 三、编写java代码实现带头节点
阅读全文
-
【设计模式】外观模式
摘要:外观模式 影院管理项目 我们先举现实中一个家庭影院的例子 DVD播放器、投影仪、自动屏幕、环绕立体声、爆米花机,要求完成使用家庭影院的功能,其过程为: 直接用遥控器:统筹各设备开关 • 开爆米花机 • 放下屏幕 • 开投影仪 • 开音响 • 开DVD,选dvd • 去拿爆米花 • 调暗灯光 • 播放
阅读全文
-
【JVM】StringTable(十四)
摘要:1、String 的基本特性 1.1、String 概述 1、String:字符串,使用一对 “” 引起来表示 1 String s1 = "mogublog" ; // 字面量的定义方式 2 String s2 = new String("moxi"); // new 对象的方式 2、String
阅读全文
-
【数据结构】数组模拟队列
摘要:一、队列的介绍 队列是 有序 的,可以用 数组 或者 链表来实现,而且队列遵循一个 先入先出 的原则,即存入队列的数据,要先取出,后存入的要后取出。 二、用数组模拟队列思路 1、队列是有序的,若使用数组的结构来存储队列的数据,首先要用 maxsize 来指定队列的最大容量。 2、因为队列的输出、输入
阅读全文
-
【数据结构】稀疏数组
摘要:一、稀疏数组介绍 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。 稀疏数组的处理方法: 1、记录数组 一共有几行几列,有多少个不同的值 2、把具有不同值的原元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模 二、图示稀疏数组 三、Java实现稀疏矩阵存储及
阅读全文
-
【数据结构】数据结构类别
摘要:数据结构类别 一、线性结构 1、线性结构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系。 2、线性结构有两种不同的存储结构,即顺序存储结构(数组)和链式存储结构(链表)。顺序储存的线性表称为顺序表,顺序表中的存储元素是连续的。 3、链式存储的线性表称为链表,链表中的存储元素不一定是连
阅读全文
-
【设计模式】组合模式
摘要:组合模式 看一个学校院系展示需求 编写程序展示一个学校院系结构: 需求是这样,要在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系。如图: 传统方案解决学校院系展示,如图: 传统方案解决学校院系展示存在的问题分析: 将学院看做是学校的子类,系是学院的子类,这样实际上是站在组织大小
阅读全文
-
【JVM】执行引擎(十三)
摘要:1、执行引擎概述 执行引擎位置 执行引擎属于JVM的下层,里面包括:解释器、即时编译器、垃圾回收器 1.1、执行引擎概述 执行引擎是Java虚拟机核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统
阅读全文
-
【设计模式】装饰者模式
摘要:装饰者模式 现在有这样一个项目,星巴克咖啡订单项目: 咖啡种类/单品咖啡:Espresso(意大利浓咖啡)、ShortBlack、LongBlack(美式咖啡)、Decaf(无因咖啡) 调料:Milk、Soy(豆浆)、Chocolate 要求在扩展新的咖啡种类时,具有良好的扩展性、改动方便、维护方便
阅读全文
-
【设计模式】桥接模式
摘要:桥接(Bridge)模式 先举个现实生活中的例子,现在对不同手机类型的不同品牌实现操作编程(比如:开机、关机、上网、打电话等),如图: 如果用传统方式如何解决呢? 我们可以看到,使用传统方式解决手机操作问题会存在下列问题: 扩展性问题(类爆炸),如果我们再增加手机的样式(旋转式),就需要增加各个品牌
阅读全文
-
【设计模式】适配器模式
摘要:适配器模式 泰国插座用的是两孔的(欧标),可以买个多功能转换插头(适配器),这样就可以使用了。 基本介绍 适配器模式(Adapter Pattern)将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper)
阅读全文
-
【设计模式】建造者模式
摘要:在软件开发过程中有时需要创建一个复杂的对象,这个复杂对象通常由多个子部件按一定的步骤组合而成。例如,计算机是由OPU、主板、内存、硬盘、显卡、机箱、显示器、键盘、鼠标等部件组装而成的,采购员不可能自己去组装计算机,而是将计算机的配置要求告诉计算机销售公司,计算机销售公司安排技术人员去组装计算机,然后
阅读全文
-
【设计模式】原型模式
摘要:原型模式基本介绍 原型模式(Prototype模式)是指:用原型实例指定创建对象的种类,并且通过拷贝这些原型,创建新的对象 原型模式是一种创建型设计模式,允许一个对象再创建另外一个可定制的对象,无需知道如何创建的细节 工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请
阅读全文
-
【设计模式】工厂模式
摘要:基本介绍 工厂模式的意义就是将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦。从而提高项目的扩展和维护性 三种工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式) 设计模式的依赖抽象原则 创建对象实例时,不要直接 new 类,而是把这个 new 类的动作放在一个工
阅读全文
-
【设计模式】单例模式
摘要:设计模式介绍 设计模式是程序员在面对同类软件工程设计问题所总结出来的有用的经验,模式不是代码,而是某类问题的通用解决方案,设计模式(Design pattern)代表了最佳的实践。这些解决方案是众多软件开发人员经过相当长的 一段时间的试验和错误总结出来的 设计模式的本质提高软件的维护性,通用性和扩展
阅读全文
-
【设计模式】七大原则之合成复用原则
摘要:合成复用原则(Composite Reuse Principle) 基本介绍 原则是尽量使用合成/聚合的方式,而不是使用继承。 如果要使用继承关系,则必须严格遵循里氏替换原则。合成复用原则同里氏替换原则相辅相成的,两者都是开闭原则的具体实现规范。 合成复用原则的重要性 通常类的复用分为继承复用和合成
阅读全文
-
【设计模式】七大原则之迪米特法则
摘要:迪米特法则(DemeterPrinciple) 基本介绍 一个对象应该对其他对象保持最少的了解 类与类关系越密切,耦合度越大 迪米特法则(DemeterPrinciple)又叫最少知道原则,即一个类对自己依赖的类知道的越少越好。也就是说,对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内部。对外除
阅读全文
-
【设计模式】七大原则之开闭原则
摘要:基本介绍 当应用的需求改变时,在不修改软件实体的源代码或者二进制代码的前提下,可以扩展模块的功能,使其满足新的需求。 开闭原则(OpenClosedPrinciple)是编程中最基础、最重要的设计原则 一个软件实体如类,模块和函数应该对扩展开放(对提供方),对修改关闭(对使用方)。用抽象构建框架,用
阅读全文
-
【设计模式】七大原则之里氏替换原则
摘要:里氏替换原则 首先,OO(Object Oriented:面向对象)中的继承性的思考和说明: 继承包含这样一层含义:父类中凡是已经实现好的方法,实际上是在设定规范和契约,虽然它不强制要求所有的子类必须遵循这些契约,但是如果子类对这些已经实现的方法任意修改,就会对整个继承体系造成破坏 继承在给程序设计
阅读全文
-
【设计模式】七大原则之依赖倒转原则
摘要:依赖倒转原则(Dependence Inversion Principle) 基本介绍: 高层模块(调用方)不应该依赖低层模块(被调用方),二者都应该依赖其抽象 抽象不应该依赖细节,细节应该依赖抽象 依赖倒转(倒置)的中心思想是面向接口编程 依赖倒转原则是基于这样的设计理念:相对于细节的多变性,抽象
阅读全文
-
【设计模式】七大原则之接口隔离原则
摘要:接口隔离原则(Interface Segregation Principle) 基本介绍: 客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上。(最小可理解为最精确,比如说类A只会使用Interface1中方法1、2、3,多出来的方法4、5就导致了不是最精确的接口,所谓精
阅读全文
-
【设计模式】七大原则之单一职责原则
摘要:一、设计模式的目的: 编写软件过程中,程序员面临来自耦合性,内聚性,可维护性,可扩展性,重用性,灵活性等多方面的挑战,设计模式是为了让程序(软件),具有更好的: 代码重用性 (即:相同功能的代码,不用多次编写) 可读性 (即:编程规范性, 便于其他程序员的阅读和理解) 可扩展性 (即:当需要增加新的
阅读全文
-
【UML】时序图
摘要:一、 什么是时序图? 时序图(Sequence Diagram),亦称为序列图、循序图或顺序图,是一种UML交互图。它通过描述对象之间发送消息的时间顺序显示多个对象之间的动态协作。 时序图是一个二维图,横轴表示对象,纵轴表示时间,消息在各对象之间横向传递,依照时间顺序纵向排列。 二、 时序图的作用是
阅读全文
-
【UML】类图
摘要:一、什么是类图 类图(Class diagram)主要用于描述系统的结构化设计。类图也是最常用的UML图,用类图可以显示出类、接口以及它们之间的静态结构和关系。 二、类图的元素 在类图中一共包含了以下几种模型元素,分别是:类(Class)、接口(Interface)以及类之间的关系。 2.1 类(C
阅读全文
-
【UML】用例图
摘要:一、什么是用例图 用例图源于Jacobson的OOSE方法,用例图是需求分析的产物,描述了系统的参与者与系统进行交互的功能,是参与者所能观察和使用到的系统功能的模型图。它的主要目的就是帮助开发团队以一种可视化的方式理解系统的功能需求,包括基于基本流程的“角色”关系以及系统各个功能之间的关系。它通过用
阅读全文
-
【UML】UML图介绍
摘要:UML图简介 UML-Unified Modeling Language 统一建模语言,又称标准建模语言。是用来对软件密集系统进行可视化建模的一种语言。UML的定义包括UML语义和UML表示法两个元素。 UML是在开发阶段,说明、可视化、构建和书写一个面向对象软件密集系统的制品的开放方法。最佳的应用
阅读全文
|