自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(19)
  • 收藏
  • 关注

原创 docker推送本地镜像到阿里云镜像仓库

1、在阿里云镜像仓库创建个人实例(地址:https://cr.console.aliyun.com/cn-hangzhou/instances)2、进入个人实例中,创建命名空间和镜像仓库创建镜像仓库时,可以选择github,也可以选择本地仓库(从本地打包镜像,再推送到阿里云仓库)3、推送镜像到阿里云仓库1)登录到远程镜像仓库$ docker login --username=userName url2)使用"docker tag"命令重命名镜像$ docker tag [ImageId]

2021-07-28 22:56:01 408

原创 springboot项目部署到docker

1、创建sprintboot项目。@Controllerpublic class TestController { @Resource private UserService userService; @GetMapping("haha") @ResponseBody public String haha() { System.out.println("欢迎光临"); return "你好啊,docker里的springboot

2021-07-28 22:34:49 260

原创 java集合之List的几种实现方式对比

本文对比分析了java集合框架中的几种list实现方式 底层数据结构 实现方式 线程安全性 优点 缺点 备注 ArrayList 数组 增加或减少元素时,需要考虑扩容;直接修改源数据。 非线程安全 按索引查找元素快 新增或减少元素需要考虑数组容量问题,.

2020-08-01 14:37:56 838

原创 对高性能、高可用java组件的一点看法

我们平时开发时,都会用到一些java中间件或工具,这些组件都或多或少会包含高可用、高性能等特点。下面以mysql、redis、kafka等组件为例,说明他们是如何实现这些特点的,希望这些特点的实现方式,能为我们开发相关组件提供一些思路。一、高可用1、mysql: 1)集群模式:一台机器存在单点问题,那就多个机器组成集群; 2)日志恢复数据:通过binlog来实现数据的恢复或主从复制。但是生成日志文件需要考虑的点是:日志保存的格式(文本、二进制等;是否压缩);日志保存的时机(...

2020-07-29 21:33:45 235

原创 Java集合框架中的modCount字段与ConcurrentModificationException

在并发环境下使用Java的集合框架,比如ArrayList、HashMap时,有时候会报ConcurrentModificationException。那么这个异常到底是怎么产生的呢?我们以ArrayList为例来说明这个问题。1、我们在ArrayList中搜索ConcurrentModificationException,会看到下面的代码:final void checkForComodification() { if (modCount != expectedModCount) .

2020-07-25 23:00:19 241

原创 设计模式之单例模式

一、单例模式介绍 一个类只能有一个实例。二、示例1、双重检查加锁方式public class Singleton { //需要使用volatile,禁止指令重排序(new instance()) private static volatile Singleton instance = null; private Singleton() {} public static Singleton getInstance() { if...

2020-07-25 18:07:01 66

原创 设计模式之模板模式

一、模板模式概述 某些同类事件中,一些流程是固定的,另一些流程是变化的,例如,在进行jdbc操作时,数据库连接、异常catch,资源释放等功能是固定的,而sql的执行和结果的返回则是变化的:public Result query(String sql) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try{ conn = dataS...

2020-07-25 17:40:43 74

原创 Java数据结构之Stack的简单实现

Stack是一种数据结构,主要功能包括存放数据、取数据、删除栈中的元素等,下面分别用数组和链表结构实现Stack1、Stack接口public interface MyStack<E> { /** * 向栈顶插入元素 * @param e */ void push(E e); /** * 获取栈顶元素 * @return 栈顶元素 */ E peek(); /** * 获

2020-07-25 14:49:47 190

原创 Jackson序列化导致npe问题

一、问题描述 在使用jackson进行序列化时,报npe。最终定位到原因:有一个public方法是is开头的,该方法里调用的对象为null,导致序列化的时候出现npe。二、问题复现1、创建Tpp类public class Tpp implements Serializable { private String tppName; private TppSrc reqSrc; public String getTppName() { retur..

2020-07-25 13:23:54 594

原创 Java注解分析与使用

1.Java Annotation概述:Annotation是代码里的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相应的处理。通过使用Annotation,我们可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充的信息。代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证或者进行部署。 Annotation提供了一条为程序设置元数据的方法,从某些方面来看,Annotation就像修饰符一样被使用,可用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明,这些信息被存储在..

2020-07-12 22:50:33 64

原创 Java动态代理和cglib代理

一.Java动态代理 动态代理的本质是,生成目标类的一个代理类,在实际调用中,调用的是代理类中的方法。具体实例:1、接口public interface Hello { void say();}2、实现类public class HelloService implements Hello { @Override public void say() { System.out.println("你好啊Java"); }}...

2020-07-08 23:21:43 123

原创 Comparable和Comparator比较

Comparable和Comparator都是一个比较器接口,都能用于比较两个对象。根据接口的名称可知,实现Comparable的类将具备比较的能力;实现Comparator的类本身就是一个比较器。1.比较器抽象方法public interface Comparable<T> { public int compareTo(T o);}public interface Comparator<T> { int compare(T o1, T...

2020-07-07 21:18:41 111

原创 HashSet去重原理

HashSet中的元素是不重复的,那么是何如做好这点呢?下面就结合源码来看这个问题(源码基于JDK1.8)。1、HashSet.add()方法public boolean add(E e) { return map.put(e, PRESENT)==null;} HashSet中的数据存储在一个Map中,其提供的操作也是依赖这个map来实现的。 add方法只是调用map的put方法来添加元素,并没有什么过滤逻辑。因此去重逻辑应该在map的put方法中。2、H...

2020-07-05 21:59:54 1923

原创 LinkedBlockingQueue源码理解

一、类介绍 基于链表实现的FIFO阻塞队列实现类。二、属性介绍//链表节点static class Node<E> { E item; /** * 当前节点的后继节点 */ Node<E> next; Node(E x) { item = x; }}/** 队列容量,没指定时容量为 Integer.MAX_VALUE */private final int capacity;/** 队列内当...

2020-07-05 21:07:25 70

原创 Semaphore源码理解

一、类介绍 Semaphore是一个信号量。可以控制并发线程访问的数量。本质上来说,Semaphore是一个限流器,采用的形式是令牌桶模型。二、原理介绍 Semaphore中有一个内部类Sync,Sync继承了AQS类,Sync有两个子类:FairSync(公平的同步器)和NonfairSync(非公平的同步器)。公平和非公平之间的差异只有一点:那就是在获取锁(令牌)的时候,公平锁会先判断CLH链表里有没有等待获取锁的节点,再去获取令牌,而公平锁则直接去获取令牌。(...

2020-07-05 20:53:59 78

原创 ThreadPoolExecutor源码理解

一、类介绍 1、ThreadPoolExecutor可用于构建线程池。二、变量介绍1、线程池的状态控制是通过ctl变量来实现的,它是一个AtomicInteger变量,且包含了两个字段的含义:(1)workCount:表示有效的工作线程的数量;(2)runStatus:线程池的状态。ctl的高3位表示线程池的运行状态,低29位表示工作线程的个数。 为了把这两个字段用一个变量来表示,我们把workCount的值限制在(2^29) -1内,而不是(2^31)-1,以后要扩...

2020-06-26 16:42:01 125

原创 CyclicBarrier源码理解

一、CyclicBarrier介绍一个批次的线程都到达某种状态(调用CyclicBarrier.await方法)后,再执行另一个任务(由最后一个调用await方法的线程执行)。同时,它是可以重复使用的,通过重置状态;而CountDownLatch是不能重复用的;二、原理创建CyclicBarrier实例时,指定线程数量和后续任务(也可以不指定这个任务),调用await()方法进行等待,await方法内部使用ReentrantLock,对等待中的线程数量减1,当等待中的线程数量为0时,则执行指定的后续

2020-06-21 21:14:40 68

原创 CountDownLatch源码理解与使用介绍

一、CountDownLatch介绍CountDownLatch的作用在于,让一个或多个线程进入等待状态,直到其他一些线程执行完毕。CountDownLatch的初始化需要传入一个count参数,await()方法会阻塞,直到count值因为countDown()方法的调用而变成0,之后,所有正在等待的线程将恢复,后续的await()方法的调用也会立即返回。这是一个一次性操作,count值不能被重置。当你需要能够重置count值的版本,你可以考虑CyclicBarrier。每次调用countDown(

2020-06-21 21:05:24 75

原创 dubbo学习一:使用idea+maven+spring创建一个dubbo工程

下面介绍下如何从零开始,使用idea+maven+spring(不使用zookeeper)搭建一个dubbo项目,并正常运行起来。一.新建一个idea工程,选择maven就行。 选择maven工程,不需要选择“create from archetype”。点击“next”,输入groupiD和ArtifactId, 点击“next”,完成工程创建。 ...

2018-08-27 02:51:02 1299

空空如也

空空如也

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

TA关注的人

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