自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

如不來的博客

知幻即离,不假方便;离幻即觉,亦无渐次。

  • 博客(321)
  • 收藏
  • 关注

原创 设计模式04——创建型模式

一、概述 创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是“将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节,对象的创建由相关的工厂来完成。就像我们去商场购买商品时,不需要知道商品是怎么生产出来一样,因为它们由专门的厂商生产。 创建型模式分为以下几种:  单例(Singleton)模式:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。  原型(Prototype)模式:将一个对象作为原型,通过对其进行复制而克隆出多个

2021-01-08 18:04:51 23

原创 JVM——04运行时数据区(2)

一、堆 一个Java进程会创建一个JVM实例,一个JVM实例中会有一个堆和一个方法区,堆和方法区在该进程中的所有线程中是共享的。堆是Java内存管理的核心区域。 Java堆区在JVM启动的时候被创建,创建时其空间大小也就确定了(堆内存的大小在JVM启动前是可以设置的),堆应该说是JVM管理的最大的一块内存空间。&...

2020-11-02 23:58:09 551

原创 ES升级和数据迁移

一、背景 公司项目升级,ES版本由原来的2.x升级到5.x,同时会涉及到海量数据(几十个T)的迁移。二、方案 1、高版本ES直接使用低版本ES的持久化数据文件和日志文件  编辑elasticsearch.yml配置文件使path.data和path.logs的路径指向低版本对应的路径。  结果:未能识别出数据,应该是存在版本兼容性问题 2、利用第三方工具将低版本的索引数据导入到高版本中  选择的工具是elasticsearch-migration,相关介绍:elasticsearch-migr

2020-10-30 16:11:40 176

原创 使用Java实现Linux简易终端

核心工具类:public final class CommandUtil { private static final Logger LOGGER = LoggerFactory.getLogger(CommandUtil.class); private static final Long THREAD_IDLE_MAX_SECONDS = 120L; /** * 系统换行符 */ public static final String LINE_SEPARATOR = System.

2020-10-22 19:29:22 141 1

原创 JVM——03运行时数据区(1)

一、运行时数据区概述 内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM内存布局规定了Java在运行过程中内存的申请、分配、管理等的策略,虽然不同的JVM对于内存的划分方式和管理机制存在着部分差异,但目的都是保证JVM的高效稳定运行。 如上图所示:Java虚拟机定义了若干种程序运行其间会使用到的运行时数据区,其中红色部分(即方法区和堆)会随着虚拟机启动而创建,随着虚拟机退出而销毁,是线程共享的。灰色部分(程序计数器、虚拟机栈和本地方法栈)则是与线程一一

2020-10-07 23:28:07 42

原创 JVM——02类加载子系统

一、JVM的内存结构 详细的内存结构图: 这个结构图基本上反映了Java代码的执行过程:先是类加载器将编译好的字节码文件加载到JVM的方法区,加载包括加载阶段、链接阶段和初始化阶段,然后由执行引擎执行,在执行的过程中会根据方法的调用产生对应线程的虚拟机栈和程序计数器以及本地方法栈等。二、类加载子系统 类加载子系统负责从文件系统或者网络中加载.class文件,.class文件在文件开头有特定的文件标识。 ClassLoader只负责.class文件的加载,至于它是否可以运行,则由Executi

2020-09-28 23:25:28 111

原创 JVM——01JVM简介

一、JVM的定位 从Oracle官网中Java语言的架构图上可以看到JVM是Java语言的基石,所有的

2020-09-26 23:39:18 42

原创 Java面试——ConcurrentHashMap

参看:ConcurrentHashMap详解

2020-09-10 22:54:39 31

原创 Java面试——JVM

1、Java代码的执行过程  编译->加载->解释->执行。  通过Java编译器将源代码(.java)编译(javac,即java compile)成字节码文件(.class),然后通过类加载器将编译好的字节码文件加载到JVM的内存(方法区)中,然后再通过解释器将加载的字节码解释成机器能够识别的机器码指令,最后由机器(即操作系统)执行这些指令。  Java能够做到“一次编译,处处运行”,是因为Java编译器的实现是一样的,也就是说相同的Java源代码(.java文件)通过不同的JV

2020-09-06 00:49:28 508

转载 Gradle

Gradle用户指南

2020-01-21 15:37:53 131

原创 Java使用selenium爬取网页源代码并通过邮件发送

1、项目搭建:idea + gradle + springboot build.gradle:引入selenium相关依赖apply plugin: 'java'apply plugin: 'maven'apply plugin: 'idea'apply plugin: 'org.springframework.boot'sourceCompatibility = 1.8group...

2020-01-16 20:30:30 319

原创 无头浏览器(Headless Chrome)的使用

一、Windows系统 1、安装Chrome  略 2、配置系统环境变量  将Chrome的安装目录(chrome.exe所在的目录)追加到系统变量的path变量中,比如我的Chrome安装在了:C:\Program Files (x86)\Google\Chrome\Application 3、使用  在dos命令窗口输入命令:使用无头模式将https://baidu.com的网页...

2020-01-14 16:47:35 1701

原创 扯扯Java开发的淡

  有人说:这个世界上有两件最难的事, 一是把别人的钱装进自己的口袋;二是把自己的思想装进别人的脑袋。对于第一件,有些人做起来并没有那么难,而且做得相当成功,那就是乞丐;至于第二件有两个人虽做得比较成功,但却艰辛的多,其中一个是老师,另一个则是创业者。  我不是老师,也不是创业者,但我想做做第二件事。  作为一个从事后端开发的程序员,自然避免不了要为前端提供后台接口。那么,应该给前端提供几个后...

2020-01-11 00:58:56 322

原创 设计模式03——面向对象设计原则

 在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据 7 条原则来开发程序,从而提高软件开发效率、节约软件开发成本和维护成本。一、开闭原则 1、定义  开闭原则(Open Closed Principle,OCP)由勃兰特·梅耶(Bertrand Meyer)提出,他在 1988 年的著作《面向对象软件构造》(Object Oriented So...

2020-01-02 17:08:04 221

原创 设计模式02——UML类图

一、UML简介 统一建模语言(Unified Modeling Language,UML)是用来设计软件蓝图的可视化建模语言,1997 年被国际对象管理组织(OMG)采纳为面向对象的建模语言的国际标准。它的特点是简单、统一、图形化、能表达软件设计中的动态与静态信息。 统一建模语言能为软件开发的所有阶段提供模型化和可视化支持。而且融入了软件工程领域的新思想、新方法和新技术,使软件设计人员沟通更简...

2020-01-02 14:57:10 105 1

原创 设计模式01——概述

一、设计模式的分类 1、根据目的来分  根据模式是用来完成什么工作来划分,这种方式可分为创建型模式、结构型模式和行为型模式 3 种。  ①创建型模式:用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”。GoF 中提供了单例、原型、工厂方法、抽象工厂、建造者等 5 种创建型模式。  ②结构型模式:用于描述如何将类或对象按某种布局组成更大的结构,GoF 中提供了代理、适配器、桥...

2019-12-31 13:37:27 52

原创 基于Java的泛型和反射实现通用的增删改查(4)——通用增删改查操作的优雅实现

一、回顾 在上一节,我们讲到了通用增删改查的简单实现,在简单实现中,获取对应的service或repository时,采用的是从ApplicationContext中手动获取的方式,这应该也是最容易想到的方式,因为只要使用了Spring,那么Spring就会为我们创建相应的实例并将其置于Spring容器中,我们直接从容器中获取当然是可行的。可行但不优雅,而且对于有些方法实现起来也不是很方便。这一...

2019-12-28 16:16:19 392

原创 基于Java的泛型和反射实现通用的增删改查(3)——通用增删改查操作的简单实现

一、思考 通常而言,我们会在controller中调用service层的方法进行业务处理并给前端响应,service层在业务处理的过程中会调用repository层的接口完成数据库操作。但是现在我们是将增删改查等操作抽象到了父类中,在子类中直接调用这些方法完成相应操作。那么父类在执行具体的方法时怎么才能知道应该调用哪个子类的service或者哪个子类的repository呢?这么问这个问题有点不...

2019-12-27 00:23:03 420

原创 基于Java的泛型和反射实现通用的增删改查(2)——通用增删改查操作的底层设计

一、设计理念 在互联网项目或者其他传统Web项目的开发过程中,对数据库的操作可以说是项目的核心和根本,而数据库操作无非就是增删改查,而对所有表的增删改查操作都大同小异,非常相似。如果我们能够将对单表的增删改查操作抽象出来放在父类中去实现,让所有的子类继承这个已实现了增删改查操作的父类,那么我们的工作效率无疑会大大地提升,也会使我们从这些简单无聊但又不得不去做的工作中解脱出来,将有限的精力投入到较...

2019-12-23 00:11:14 330

原创 基于Java的泛型和反射实现通用的增删改查(1)——项目搭建

 1、使用Idea创建一个gradle项目  创建时需要填写groupId等信息,这和创建maven项目一样。 2、创建项目需要的目录结构  在创建完gradle项目后你会发现Idea并没有像创建maven项目那样为我们生成必要的目录结构,你可以将下面的代码复制到你项目中的build.gradle文件的最后,然后执行create-dirs操作,完成目录结构的创建:task "create-...

2019-12-22 18:43:49 292 1

原创 基于Java的泛型和反射实现通用的增删改查(0)——概览

一、主要内容 专栏的标题基本山已概括了本专栏的主要内容,本专栏是基于Java的泛型和反射,结合SpringBoot和JPA实现生产级别的通用的增删改查,即将所有的单表的增删改查操作抽取到父类中实现,子类要做的仅仅是继承这些父类,在无需其他任何代码的情况下即可适应简单的增删改查的需求。这虽然是仅仅的百余行代码,但却可以使你的工作效率提升几倍甚至几十倍。 另外,除上面所说的将基本的增删改查抽取出来...

2019-12-18 21:27:29 281

原创 NIO——Non-blocking Server

 即使你了解 Java NIO 的非阻塞功能是怎么工作的,设计一个非阻塞的 Java NIO server 依然很困难。和阻塞式的 IO 相比,非阻塞的 IO 有多个挑战。下面就讨论一下非阻塞的 Server 面临的主要挑战,并提供一些可能的解决方案。 虽然这里描述的方案是围绕着 Java NIO 的,我想这些方案也同样适用于那些类似于 Selector 的结构的场景。这些数据结构是由底层操作系...

2019-11-25 22:45:57 67

原创 NIO——ServerSocketChannel

 ServerSocketChannel 可以监听进来的 TCP 连接,类似于 Java 网络编程中的 ServerSocket。ServerSocketChannel 类位于 java.nio.channels 包中。下面是一个示例:ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();//绑定一个端口se...

2019-10-30 00:12:15 66

原创 NIO——SocketChannel

 SocketChannel 是连接到 TCP 网络套接字的 Channel,相当于 Java 网络编程中的 Socket。有两种创建 SocketChannel 的方式:手动开启一个 SocketChannel 并连接到因特网上的一个服务器当传入的连接到达 ServerSocketChannel 时或者说 ServerSocketChannel 新进来一个连接的时候会创建一个 Socket...

2019-10-29 23:46:54 43

原创 NIO——FileChannel

 FileChannel 是一个连接到文件的通道,使用 FileChannel 可以从文件读数据,也可以向文件中写入数据。Java NIO 的 FileChannel 是标准 Java IO 读写文件的替代方案。 FileChannel 不能设置为非阻塞的模式,也就是说 FileChannel 总是阻塞的。 1、开启 FileChannel 在使用 FileChannel 之前必须先开启。但...

2019-10-27 23:40:53 80

原创 NIO——Selector

 Java NIO 的 Selector 组件可以监测一个或多个 Channel 实例,可以监听到哪一个 Channel 为读写或者其他操作做好了准备。这样一个单线程就可以管理多个 Channel,相当于管理了多个网络连接。 1、为什么使用 Selector ? 使用一个线程去处理多个 Channel 的优势在于开启的线程少了,事实上,可以仅使用一个线程去处理所有的 Channel。操作系统在...

2019-10-23 22:18:26 58

原创 NIO——通道之间的数据传输

 在 Java NIO 中,如果两个 Channel 中的一个是 FileChannel,那么这两个 Channel 可以直接传送数据。FileChannel 提供了一个 transferTo() 方法和一个 transferFrom() 方法可以做到这些。 1、transferFrom()  FileChannel.transferFrom() 方法可以从一个源 Channel 中向这个 F...

2019-10-21 01:01:02 181

原创 NIO——Scatter 和 Gather

 Java NIO 内置了 Scatter(分散器) 和 Gather(聚集器),Scatter 和 Gather 是从 Channel 中读取数据或者向 Channel 中写入数据的相关概念。 Channel 的分散(Scatter)读是指将一个 Channel 中的数据读取到多个 Buffer 中的读操作,即将这个 Channel 中的数据“分散”到多个 Buffer 中。 Channel...

2019-10-21 00:05:45 53

原创 NIO——Buffer

一、Buffer 简介 Java NIO 中的 Buffer 用于和 Channell 交互,像之前说的那样,数据从 Channel 读入到 Buffer,从 Buffer 写入到 Channel。 Buffer 本质上是一块内存,你可以向其中写入数据,之后再从中读取你写入的数据。这一块内存被包装成了一个 NIO Buffer 对象,这个对象提供了一些便于访问该内存的方法。二、Buffer ...

2019-10-17 00:09:25 76

原创 NIO——Channel

一、Channel 简介 Java NIO 中的 Channel 有些类似于 Stream,但又有些不同:一个 Channel 即可读又可写,而 Stream 通常只能单向操作,即流分为输入流(只能读)和输出流(只能写)Channel 的读和写可以异步进行Channel 总是从 Buffer 中读数据或者向 Buffer 中写数据 如上所述,你可以将 Channel 中的数据读到一个...

2019-10-16 21:33:37 62

原创 NIO——概述

 Java NIO(New IO) 从 JDK1.4 开始, 是一个可以替代标准 Java IO 和 Java 网络 IO 的IO API,Java NIO 提供了与标准 IO 不同的 IO 工作方式。一、Java NIO 的特性: 1、Channels and Buffers:通道和缓冲区  标准的 IO 是基于字节流和字符流进行操作的,而 NIO 是基于通道(Channel)和缓冲区(B...

2019-10-16 00:23:29 93 1

原创 NIO——通道Channel

一、IO的进化史 ①起初系统的IO由CPU负责,在IO频繁的时候CPU资源不能被充分利用 ②后来,有了DMA(直接存储器),当有IO操作时DMA先向CPU申请权限,DMA申请到权限后全权负责IO操作,这样CPU就可以去完成其他的操作,这就是传统的IO模式,但这种方式下当应用程序有大量的频繁的IO操作时,会导致DMA冲突 ③使用通道专门负责IO,通道是一个完全独立的处理器,不需要向CPU申...

2019-10-14 23:31:32 122

原创 NIO——缓冲区Buffer

一、缓冲区 缓冲区(Buffer)是一个用于存取特定基本数据类型数据的容器,底层是这些基本数据类型的数组,由java.nio包定义,所有缓冲区都是Buffer抽象类的子类。主要用于与NIO通道进行交互,数据是从通道读入缓冲区,从缓冲区写入通道中的。 根据数据类型不同,NIO提供了以下类型的Buffer:  ByteBuffer  CharBuffer  ShortBuffer  Int...

2019-10-14 00:54:23 106

原创 NIO——简介

一、NIO Java NIO(New IO),也可理解为Non Blocking IO(非阻塞式IO)。NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的、基于通道的IO操作。NIO相对于IO在对文件的读写上更加高效。 NIO与IO的区别:IONIO面向流(Stream Oriented)面向缓冲区(Buffer Oriented)...

2019-10-11 23:29:07 50

原创 JUC锁——Condition条件

Condition介绍  Condition的作用是对锁进行更精确的控制。Condition中的await()方法相当于Object中的wait()方法,Condition中的signal()方法相当于Object中的notify()方法,Condition中的signalAll()相当于Object的notifyAll()方法。不同的是,Object中的wait()、notify()、noti...

2019-10-09 23:38:36 84

原创 JUC锁——Semaphore(信号量)

Semaphore简介  Semaphore是一个计数信号量,它的本质是一个"共享锁"。信号量维护了一个信号量许可集。线程可以通过调用acquire()来获取信号量的许可;当信号量中有可用的许可时,线程能获取该许可;否则线程必须等待,直到有可用的许可为止。 线程可以通过release()来释放它所持有的信号量许可。Semaphore的函数列表// 创建具有给定的许可数和非公平的公平设置的 S...

2019-10-09 23:38:13 69

原创 JUC锁——CyclicBarrier

CyclicBarrier简介  CyclicBarrier是一个同步辅助类,允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。CountDownLatch和CyclicBarrier的对比:①CountDownLatch的作用是允许1或N个线程等待其他线程完成执行...

2019-10-09 23:38:01 55

原创 JUC锁——CountDownLatch

概要  和ReadWriteLock.ReadLock一样,CountDownLatch的本质也是一个"共享锁"。CountDownLatch简介  CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。CountDownLatch和CyclicBarrier的区别:①CountDownLatch的作用是允许1或N个线程等待其...

2019-10-09 23:37:50 57

原创 JUC锁——LockSupport

LockSupport介绍  LockSupport是用来创建锁和其他同步类的基本线程阻塞原语。LockSupport中的park() 和 unpark() 的作用分别是阻塞线程和解除阻塞线程,而且park()和unpark()不会遇到Thread.suspend 和 Thread.resume所可能引发的死锁问题。因为park() 和 unpark()有许可的存在,调用 park() 的线程和...

2019-10-09 23:37:39 58

原创 JUC锁——可重入互斥锁ReentrantLock

ReentrantLock介绍ReentrantLock是一个可重入的互斥锁,又被称为“独占锁”。顾名思义,ReentrantLock锁在同一个时间点只能被一个线程所持有;而可重入的意思是,ReentrantLock锁可以被单个线程多次获取。ReentrantLock分为“公平锁”和“非公平锁”,它们的区别体现在获取锁的机制上是否公平。“锁”是为了保护竞争资源,防止多个线程同时操作同一个资源而出...

2019-10-09 23:37:06 87

空空如也

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人 TA的粉丝

提示
确定要删除当前文章?
取消 删除