- 博客(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
471
原创 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
325
原创 java集合之List的几种实现方式对比
本文对比分析了java集合框架中的几种list实现方式 底层数据结构 实现方式 线程安全性 优点 缺点 备注 ArrayList 数组 增加或减少元素时,需要考虑扩容;直接修改源数据。 非线程安全 按索引查找元素快 新增或减少元素需要考虑数组容量问题,.
2020-08-01 14:37:56
939
原创 对高性能、高可用java组件的一点看法
我们平时开发时,都会用到一些java中间件或工具,这些组件都或多或少会包含高可用、高性能等特点。下面以mysql、redis、kafka等组件为例,说明他们是如何实现这些特点的,希望这些特点的实现方式,能为我们开发相关组件提供一些思路。一、高可用1、mysql: 1)集群模式:一台机器存在单点问题,那就多个机器组成集群; 2)日志恢复数据:通过binlog来实现数据的恢复或主从复制。但是生成日志文件需要考虑的点是:日志保存的格式(文本、二进制等;是否压缩);日志保存的时机(...
2020-07-29 21:33:45
278
原创 Java集合框架中的modCount字段与ConcurrentModificationException
在并发环境下使用Java的集合框架,比如ArrayList、HashMap时,有时候会报ConcurrentModificationException。那么这个异常到底是怎么产生的呢?我们以ArrayList为例来说明这个问题。1、我们在ArrayList中搜索ConcurrentModificationException,会看到下面的代码:final void checkForComodification() { if (modCount != expectedModCount) .
2020-07-25 23:00:19
294
原创 设计模式之单例模式
一、单例模式介绍 一个类只能有一个实例。二、示例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
97
原创 设计模式之模板模式
一、模板模式概述 某些同类事件中,一些流程是固定的,另一些流程是变化的,例如,在进行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
99
原创 Java数据结构之Stack的简单实现
Stack是一种数据结构,主要功能包括存放数据、取数据、删除栈中的元素等,下面分别用数组和链表结构实现Stack1、Stack接口public interface MyStack<E> { /** * 向栈顶插入元素 * @param e */ void push(E e); /** * 获取栈顶元素 * @return 栈顶元素 */ E peek(); /** * 获
2020-07-25 14:49:47
242
原创 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
669
原创 Java注解分析与使用
1.Java Annotation概述:Annotation是代码里的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相应的处理。通过使用Annotation,我们可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充的信息。代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证或者进行部署。 Annotation提供了一条为程序设置元数据的方法,从某些方面来看,Annotation就像修饰符一样被使用,可用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明,这些信息被存储在..
2020-07-12 22:50:33
95
原创 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
159
原创 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
157
原创 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
1986
原创 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
107
原创 Semaphore源码理解
一、类介绍 Semaphore是一个信号量。可以控制并发线程访问的数量。本质上来说,Semaphore是一个限流器,采用的形式是令牌桶模型。二、原理介绍 Semaphore中有一个内部类Sync,Sync继承了AQS类,Sync有两个子类:FairSync(公平的同步器)和NonfairSync(非公平的同步器)。公平和非公平之间的差异只有一点:那就是在获取锁(令牌)的时候,公平锁会先判断CLH链表里有没有等待获取锁的节点,再去获取令牌,而公平锁则直接去获取令牌。(...
2020-07-05 20:53:59
124
原创 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
153
原创 CyclicBarrier源码理解
一、CyclicBarrier介绍一个批次的线程都到达某种状态(调用CyclicBarrier.await方法)后,再执行另一个任务(由最后一个调用await方法的线程执行)。同时,它是可以重复使用的,通过重置状态;而CountDownLatch是不能重复用的;二、原理创建CyclicBarrier实例时,指定线程数量和后续任务(也可以不指定这个任务),调用await()方法进行等待,await方法内部使用ReentrantLock,对等待中的线程数量减1,当等待中的线程数量为0时,则执行指定的后续
2020-06-21 21:14:40
95
原创 CountDownLatch源码理解与使用介绍
一、CountDownLatch介绍CountDownLatch的作用在于,让一个或多个线程进入等待状态,直到其他一些线程执行完毕。CountDownLatch的初始化需要传入一个count参数,await()方法会阻塞,直到count值因为countDown()方法的调用而变成0,之后,所有正在等待的线程将恢复,后续的await()方法的调用也会立即返回。这是一个一次性操作,count值不能被重置。当你需要能够重置count值的版本,你可以考虑CyclicBarrier。每次调用countDown(
2020-06-21 21:05:24
101
原创 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
1345
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人