- 博客(123)
- 收藏
- 关注
原创 使用枚举来实现单例模式
单例模式的实现方式有很多种,详情可以参考单例模式的7种实现方式及分析,从线程安全以及懒加载等角度来看其中第6种(double check)和第7种(静态内部类)的实现方式都是值得推荐并且应用广泛的,但是它们(包括第1到第7种)都有一个痛点,就是无法阻止通过反射或者序列化来破解单例对象的唯一性反射破解下列代码以double check方式实现的单例模式为示例,详情如下:代码publi...
2019-09-17 00:38:07
826
原创 java中的单例模式为什么需要懒加载?
想必很多朋友在java中都使用过单例模式,在网上搜索的时候也都查到过各种单例模式的实现,比如我之前写的一篇博客:单例模式的7种实现方式及分析(https://blog.csdn.net/xyc_csdn/article/details/78165948),在这些博客中基本都会提到一个词,就是“懒加载”,但是也没有具体解释,让人感到头大。但是当你细想的时候你就会发现有些不对劲,因为JVM加载一个类...
2019-09-11 23:07:21
1027
原创 git忽略target目录
1、目录结构2、.gitignore文件*.class.DS_Storeapplication.pid# Mobile Tools for Java (J2ME).mtj.tmp/# Package Files #*.jar*.war*.ear# virtual machine crash logs, see http://www.java.com/en/downlo...
2019-08-22 22:49:08
11966
1
原创 代码实践之Job如何从MySql获取数据
相信很多人都写过Job,特别是对于从MySql进行大数据量(百万级、千万级甚至亿级)的频繁读取,在这种场景下如何从数据库查询数据就不是一个简单的问题了,查询效率至关重要!我们先看一下最常见也是应用最广泛的写法:select * from tableName where ... limit m,n;这种写法对于用户从前端读取数据的场景下是满足需求的,因为m和n的值都不会很大,最多两位数,...
2019-08-18 17:29:17
357
原创 在java中如何正确的判断字符串是否为"空"
其实对于字符串判空来说不是什么有难度的操作,甚至是低难度的,只是对于’\u0000’这个字符有的人可能还是比较陌生,而它就是这篇博客的重点!我们先看一下’\u0000’打印出来的效果是什么样的吧,如下:打印代码public static void main(String[] args) { System.out.println("----\u0000----");}打...
2019-08-11 13:52:44
1325
原创 从项目迁移看项目分层
最近在进行.net项目的转java工作,尽管本身是个.net小白,但得益于这两个语言的相似性,在语法上并没有碰到什么大的困难,有时候有问题也有一些同事可以请教,最大的问题反而是非语言层面的,例如其中的一点:项目分层! 其实我一向认为一个运行中的项目,不管它的代码多么差,但是只要它能正常稳定的完成预期的工作,那它就是一段好代码,我们也轻易不要去优化它。可是现在我们需要转项目,到了不得不动它的...
2019-04-08 15:41:37
228
原创 记一次Hive平台清洗数据
场景(简化)现有文章表Article和评论表Comment;一篇文章可以有多个评论;文章表Article主要字段(articleId);评论表Comment主要字段(commentId,articleId,content,createTime,lastChangeTime);问题描述发现很多文章下出现了评论内容一样的评论,所以需要对文章的评论进行数据清洗,即同一文章下相同内容的点评只保...
2019-01-03 16:10:01
4465
原创 关于Map.getOrDefault方法的一个小坑
场景对于某些情况下,我们不希望Map返回的值为null,所以理所当然的想到了getOrDefault方法,我之前的想法是getOrDefault方法会在get到的结果为null时返回默认值,然而却不是。代码Map<String, Integer> map = new HashMap<>();map.put("a", null);map.put("b", 2);...
2018-12-20 19:18:45
7524
5
原创 关于"Specified key was too long; max key length is xxx bytes"
场景给MySql数据库表Varchar类型字段加索引时报错:“Specified key was too long; max key length is xxx bytes”;原因字段太长导致无法加索引;解决修改字段长度,注意编码格式,例如你的字段长度为100(指的是字符数),而编码是utf-8,那么最大占用3乘100=300 byte,如果编码是utf8mb4则最大占用4乘100=40...
2018-09-21 19:50:19
43362
原创 SqlServer数据库迁移至MySql注意点——
先看区别SqlServertinyint:范围(0,255),存储大小为 1 字节MySqltinyint:有符号范围 ~ (-128,127),无符号范围 ~ (0,255),存储大小为 1 字节故当SqlServer表中含有Tinyint类型字段时,迁入到MySql需要将字段的无符号选择勾上,否则取值范围不一致(除非你的取值可以保证在(0,127)之内)...
2018-09-20 21:12:41
630
原创 utf-8和utf8mb4
MySQL在5.5.3版本之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode编码(例如:Emoji表情等),utf8mb4是utf8的超集。utf8utf8mb4最大字符长度3字节4字节兼容性差好存储空间消耗少多...
2018-09-20 20:59:10
747
原创 SqlServer判断函数是否存在并打印字符串
if exists (select * from sysobjects where xtype='fn' and name='函数名') print '存在函数xxx';else print '不存在函数xxx'; print '进行创建...';
2018-09-17 14:28:13
1380
原创 Hive平台UDF调用实践之乱码
应用场景 从Hive数据仓库批量捞取数据通过UDF中HttpURLConnection调用至服务端;问题 服务端拿到的中文数据部分存在乱码;排查1、查询MySql数据库,发现源数据非乱码且编码格式为UTF-8;2、查询Hive数据仓库,发现数据非乱码且编码格式为UTF-8;3、初步判断乱码发生在HttpURLConnection调用过程中;解决修...
2018-09-14 14:05:01
1268
原创 MQ百万级数量调用注意点
注意消息的过期时间,大数据量的情况下消息的过期时间需要设置长一点;MQ最好可以提供版本号功能,对于批量调用失败的批处理可以根据版本号作废已经放入消息队列中的消息;...
2018-09-14 13:52:40
1015
原创 【强制】表单、 AJAX 提交必须执行 CSRF 安全过滤。
CSRF(Cross - site request forgery) 跨站请求伪造是一类常见编程漏洞。对于存在CSRF 漏洞的应用/网站,攻击者可以事先构造好 URL ,只要受害者用户一访问,后台便在用户 不知情情况下对数据库中用户参数进行相应修改。 具体思路:1、跳转页面前生成随机token,并存放在session中2、form中将token放在隐藏域中,保存时将...
2018-09-07 15:13:03
1036
原创 字符串连接工具类
JoinTypepackage org.eve.framework.string.join;/** * 连接类型 * * @author xiayc * @date 2018/9/7 */public enum JoinType { /** * 连接符:_ * aaa_bbb_ccc */ STR_STR;}Strin...
2018-09-07 15:07:36
676
原创 如何获取Class的根路径
package org.eve.framework.nuwatest.resource;/** * @author xiayc * @date 2018/9/6 */public class ClassRootPath { public static void main(String[] args) { //获取ClassRootPath类的根路径 ...
2018-09-06 15:10:58
698
原创 ClassLoader的getResource和getResources
package org.eve.framework.nuwatest.resource;import java.io.IOException;import java.net.URL;import java.util.Enumeration;public class ResourceTest { public static void main(String[] args)...
2018-09-06 14:54:46
1990
原创 动态代理的注意点(一)
估计很多人都使用过动态代理,特别是处理事务时,动态代理是一个很好的解决方案,但是其中有一些注意点我们还是需要了解一下;举例伪代码如下:UserService { void a(){ this.b(); } void b(){ }}OrderService { UserService userService;...
2018-09-05 17:52:42
331
原创 Gson工具类
maven依赖 <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson --> <dependency> <groupId>com.google.code.gson</groupId> ...
2018-08-23 16:53:47
1219
原创 红黑树-插入
前言本篇博客我们说一说如何从无到有创建一颗红黑树,并在创建红黑树的过程中理解其构造原理。红黑树规则首先我们复习一下红黑树的五项规则,如下: - 规则一:每个节点或者是黑色,或者是红色; - 规则二:根节点是黑色; - 规则三:每个叶子节点(NIL/NULL)是黑色; - 规则四:如果一个节点是红色的,则它的子节点必须是黑色的; - 规则五:从一个节点到该节点的子孙节点的所有路...
2018-05-05 16:12:57
4625
1
原创 红黑树-起步
定义说到红黑树(R-B Tree),首先要知道它是一颗二叉查找树(二叉查找树(Binary Search Tree),又称二叉排序树(Binary Sort Tree),亦称二叉搜索树,下文统称为二叉查找树),其次才作为一颗红黑树。所以它不仅要满足二叉查找树的规则,而且要满足红黑树的规则。如下: - 二叉查找树 - 规则一:若左子树不空,则左子树上所有结点的值均小于它的根结点的值;...
2018-05-04 10:20:21
210
原创 红黑树-旋转
此篇博客我们讨论红黑树的旋转(左旋和右旋),为了更好的理解旋转,我们只关注红黑树中关于二叉查找树部分的规则,而不关注红黑树中关于本身红黑树定义部分的规则。二叉查找树规则 规则一:若左子树不空,则左子树上所有结点的值均小于它的根结点的值;规则二:若右子树不空,则右子树上所有结点的值均大于它的根结点的值;规则三:左、右子树也分别为二叉查找树;左旋 现有红黑树结构如下:...
2018-05-02 21:07:37
592
1
原创 使用synchronized的注意点(补充)
在这篇博客https://blog.csdn.net/xyc_csdn/article/details/78159259中我提到了一些使用synchronized时的注意点,但是还是比较浅薄,特别通过最近的面试,认识到以前的总结还是有些不足,所以在这里再次完善一下。先看代码abstract class AbstractSynchronized { protected...
2018-04-12 21:00:50
1313
原创 单例模式的7种实现方式及分析
第一种代码package com.xiayc.singleton;/** * 饿汉模式 * @author xyc * */public class Hungry { private Hungry() { } private volatile static Hungry singleton = new Hungry(); public static Hungr
2017-10-06 16:48:35
1661
2
原创 多线程Object之wait、notify
代码package com.xiayc.waitnotify;import java.util.ArrayList;import java.util.List;/** * 1、wait、notify和notifyAll方法是Object类提供的,换句话说Java中所有的对象都有这三个方法; * 2、wait、notify和notifyAll方法要配合synchronized关键字同步操作才有意
2017-10-06 16:17:38
279
原创 java多线程之volatile
在了解之前我们需要先了解一下Java内存模型(区别与JVM的内存模型)。Java内存模型 Java 内存模型来屏蔽掉各种硬件和操作系统的内存差异,达到跨平台的内存访问效果。JLS(Java语言规范)定义了一个统一的内存管理模型JMM(Java Memory Model) Java内存模型规定了所有的变量都存储在主内存中,此处的主内存仅仅是虚拟机内存的一部分,而虚拟机内存也仅仅是计算机物理内存的
2017-10-05 15:16:32
291
原创 synchronized锁的重入问题
我们知道通过synchronized关键字修饰的方法或代码块在同一时刻只能被一个线程访问,还有一种就是锁的重入问题,就是一个线程可以访问多个被synchronized修饰的方法或代码块,代码如下:代码package com.xiayc.sync;public class ReentrantSynchronized { public class Super{ public sy
2017-10-05 14:32:01
547
原创 使用synchronized的注意点
在http://blog.csdn.net/xyc_csdn/article/details/78155932这篇博客中详细讲了一下synchronized关键字的使用方法。在这里补充几个使用synchronized时需要注意的点。先看代码ObjectLock.javapackage com.xiayc.sync;public class ObjectLock ...
2017-10-04 20:22:53
465
原创 Java多线程之synchronized
一、什么是synchronized synchronized是java提供的关键字,被synchronized修饰的代码在同一时刻只能被一个线程访问。用于解决java代码中多个线程的共享存储空间的访问冲突问题,有效避免了同一个数据对象被多个线程同时访问。二、synchronized的使用方式使用synchronized关键字修饰在成员方法/静态方法前,如:public synchronize
2017-10-03 19:39:55
365
原创 浅谈CountDownLatch的用法
CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。 CountDownLatch是在java1.5被引入的,跟它一起被引入的并发工具类还有CyclicBarrier、Semaphore、ConcurrentHashMap和BlockingQueue,它们都存在于java.util.concurrent包下。CountDownLat
2017-09-16 11:06:29
576
原创 Initialization failed for 'https://start.spring.io' Please check URL, network and proxy settings.
错误描述:IntellijIDEA创建SpringBoot项目报错Initialization failed for 'https://start.spring.io' Please check URL, network and proxy settings. Error message: connect timed out解决方案:修改https://start.spring.io为http:/
2017-09-11 20:52:00
2969
2
原创 关于netty的HttpUtil.isTransferEncodingChunked(HttpMessage)方法已过时解决方案
在使用最新的netty5时发现HttpUtil.isTransferEncodingChunked(HttpMessage)方法已过时,已经不能用,真的很坑爹。 解决方案就是使用HttpHeaderUtil.isTransferEncodingChunked(HttpMessage)方法代替。
2017-09-09 21:28:32
739
原创 Spring的BeanPostProcessor接口实现Demo
如果我们需要在Spring容器完成Bean的实例化,配置和其他的初始化后添加一些自己的逻辑处理,我们就可以定义一个或者多个BeanPostProcessor接口的实现。 需要注意的是,实现了BeanPostProcessor接口后,Spring容器会在初始化所有Bean的过程中调用postProcessBeforeInitialization和postProcessAfterInitializ
2017-08-20 12:03:04
2030
原创 Spring容器中init Bean和destroy Bean的方式
代码package com.xyc.initanddestorybean.component;import org.springframework.beans.factory.DisposableBean;import org.springframework.beans.factory.InitializingBean;import org.springframework.stereotype
2017-08-20 11:25:34
1033
原创 自定义权限模块4——后端权限拦截
本篇博客接着上篇博客自定义权限模块3——后端代码实现,并在上篇博客项目的基础上进行改造。目录结构 修改SecurityApplication.javapackage com.xyc.security;import com.xyc.security.interceptor.SecurityInterceptor;import org.springframework.boot.SpringAppl
2017-08-13 20:07:42
588
原创 自定义权限模块3——后端代码实现
本篇博客接着上篇博客自定义权限模块2——自定义tld标签,并在上篇博客项目的基础上进行改造。在上篇博客中我们初步看到权限控制的效果,前端通过自定义标签根据我们后端提供的权限值来选择加载或不加载某些UI,但是后端的代码还没有完善,上篇博客只是提供了前端的解决方案,这一篇博客来解决后端的实现。 实现之前有几点需要明确,首先后端要自定义注解Moudle和Permission,Moudle注解在Con
2017-08-13 17:26:18
806
1
原创 自定义权限模块2——自定义tld标签
本篇博客接着上篇博客自定义权限模块1——SpringBoot支持JSP,并在上篇博客项目的基础上进行改造。目录结构LoginUserInfo.javapackage com.xyc.security.bo;import java.io.Serializable;import java.util.List;import java.util.Map;/** * 登录用户信息 * Created
2017-08-13 11:53:52
468
原创 自定义权限模块1——SpringBoot支持JSP
虽然springBoot官方建议大家使用thymeleaf,但是作为一名习惯了jsp的人来说,thymeleaf真的不怎么好用,还好springBoot还是支持jsp的,在这里教一下大家怎么配置。目录结构首先在main目录下创建webapp/WEB-INF/jsp目录pom.xml在你的pom.xml文件中添加如下依赖:<!--添加对tomcat的支持--><dependency>
2017-08-12 14:36:13
4141
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人