
java
文章平均质量分 58
刘彦民
尽最大的努力把方便留给别人和未来的自己
展开
-
基于ReentrantLock深入分析AQS原理
基于ReentrantLock深入分析AQS原理此篇文章基于JDK8来分析的,在JDK9及以后的版本源码实现略有不同,不过思路是一样的,只是在JDK9中推出了新的类型 VarHandle 变量句柄,替代Unsafe的大部分功能。Java中大部分同步类(ReentrantLock、CountDownLatch、Semaphore、ReentrantReadWriteLock等)都是基于AQS实现的。AQS提供了原子式管理同步状态(state)、可以阻塞和唤醒线程、FIFO双端队列模型实现的简单框架。AQS原创 2021-03-14 16:11:03 · 344 阅读 · 0 评论 -
基于AQS实现同步锁
基于AQS实现同步锁一、实现原理本篇文章基于AQS来手动实现一个同步锁,实现锁的基本功能,加锁和解锁。在实现之前,需要了解什么是AQS,以及AQS的核心原理。然后,可参考ReentrantLock的实现原理,来实现自己的同步锁。以下是ReentrantLock的实现大体思路:实现步骤:自定义同步类Sync,继承AbstractQueuedSynchronizor,重写tryAcquire() 和 tryRelease()。实现加锁解锁api接口,lock() 和 unlock()。这两个法原创 2021-03-08 21:42:53 · 380 阅读 · 0 评论 -
高并发下实现线程安全的i++操作
高并发下实现线程安全的i++操作一、使用synchronized这个比较简单,就是在进行i++操作时,直接使用synchronized加锁,也可以使用Lock加锁,本质都是一样的(锁原理不同),最终都是通过加锁来保证多线程安全的。public class Synchronized_add { int i = 0; public synchronized void add() { i++; } public static void main(String[原创 2021-03-06 21:56:47 · 1591 阅读 · 0 评论 -
放弃丑陋的 swagger-ui,使用 knife 接口文档生成神器
文章目录接口生成利器 knife 介绍springboot 整合 knifepom.xml 文件增加依赖编写Swagger2Config配置文件注意事项总结knife Gitee 地址:https://gitee.com/xiaoym/knife4j接口生成利器 knife 介绍之前项目中一直在使用 swagger 生成后台接口文档,很好用,至少比之前用 word 写接口文档 postman 调试接口方便多了。swagger 提供了一套前端页面,但是需要在代码中加入注解,如: @Api @ApiOpe原创 2021-02-21 20:05:58 · 2907 阅读 · 0 评论 -
基于struts2--实现文件上传下载
1. 文件的上传:1). 表单需要注意的 3 点①. method="post" ②. enctype="mulitipart/form-data" ③. <s:file name=""></s:file><s:form action="testUpload" theme="simple" enctype="mu原创 2015-02-08 08:42:02 · 622 阅读 · 0 评论 -
Struts2工作原理
Struts2工作原理Struts2请求响应流程: 在struts2的应用中,从用户请求到服务器返回相应响应给用户端的过程中,包含了许多组件如:Controller、ActionProxy、ActionMapping、Configuration Manager、ActionInvocation、Inerceptor、Action、Result等。下面我们来具体看看这些组件有什么联系,它们之间是怎样...转载 2015-02-08 21:16:52 · 426 阅读 · 0 评论 -
Android中Activity的四种开发模式
Activity的四种启动模式:standard、singleTop、singleTask、singleInstance 清单文件中的Activity配置使用:android:launchMode=""属性指定启动模式 1、standard:默认模式,每次启动都会创建一个新的Activity对象,放到目标任务栈的栈顶 2、singleTop:判断当前的任务栈顶是否存在相同的Activity,...原创 2015-04-23 20:28:52 · 460 阅读 · 0 评论 -
Java-使用IO流对大文件进行分割和分割后的合并
有的时候我们想要操作的文件很大,比如:我们想要上传一个大文件,但是收到上传文件大小的限制,无法上传,这是我们可以将一个大的文件分割成若干个小文件进行操作,然后再把小文件还原成源文件。分割后的每个小文件的类型可以自己定义。一下是我编写的一个大文件的分割和合并的代码:package com.lym;import java.io.BufferedInputStream;import java.io...原创 2015-05-11 08:54:51 · 12154 阅读 · 9 评论 -
一个简单的网络爬虫-从网上爬取美女图片
CrawlerPicture.java 文件package com.lym.crawlerDemo;import java.io.DataInputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import...原创 2015-07-27 20:26:33 · 4997 阅读 · 8 评论 -
基于struts2框架-自定义身份证号验证器
自定义拦截器的步骤:1、定义一个验证器的类:> 自定义的验证器都需要实现 Validator接口. > 可以选择继承 ValidatorSupport 或 FieldValidatorSupport 类,这两个类都实现了Validator接口了;FieldValidatorSupport继承ValidatorSupport,FieldValidatorSupport用于 字段验证&...原创 2015-02-06 20:10:51 · 733 阅读 · 0 评论 -
java中使用MD5对密码进行加密
import org.springframework.security.authentication.encoding.MessageDigestPasswordEncoder;import org.springframework.security.core.Authentication;import org.springframework.security.core.context.Secu...原创 2015-01-17 11:03:44 · 6052 阅读 · 0 评论 -
使用DAO工厂创建实现类对象
首先分析DAO模式中的每一部分VO(对象实体):这个类成员变量与数据库中每个字段一一对应,同时提供了相应是set和get方法来设置或取得数值。这个类一般是通过IDE自动生成的DAO(数据访问接口):这个是业务逻辑层使用数据持久化层服务的一个接口DAOFactory(工厂类):它提供了创建DAO类的一个方法,目的是更改数据持久化层实现时(比如更换数据库),不需要对业务逻辑层进行更改,只要再创建一个实...原创 2015-01-13 00:02:15 · 763 阅读 · 0 评论 -
使用new和newInstance()创建类的区别
在初始化一个类,生成一个实例的时候,newInstance()方法和new关键字除了一个是方法,一个是关键字外,最主要有什么区别?它们的区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新类。那么为什么会有两种创建对象方式?这主要考虑到软件的可伸缩、可扩展和可重用等软件设计思想。 Java中工厂模式经常使用newInstance()方法来创建对象,因此从为什么要使用工厂模式...原创 2015-01-12 19:54:44 · 627 阅读 · 0 评论 -
Servlet 3.0 新特性详解
Servlet 3.0 新特性概述Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布。该版本在前一版本(Servlet 2.5)的基础上提供了若干新特性用于简化 Web 应用的开发和部署。其中有几项特性的引入让开发者感到非常兴奋,同时也获得了 Java 社区的一片赞誉之声:异步处理支持:有了该特性,Servlet 线程不再需要一直阻塞,直到业务...转载 2015-01-11 23:34:01 · 483 阅读 · 0 评论 -
web Servlet 3.0 新特性之web模块化编程,web-fragment.xml编写及打jar包
web Servlet 3.0 模块化 原本一个web应用的任何配置都需要在web.xml中进行,因此会使得web.xml变得很混乱,而且灵活性差,因此Servlet 3.0可以将每个Servlet、Filter、Listener打成jar包,然后放在WEB-INF\lib中;注意各自的模块都有各自的配置文件,这个配置文件的名称为 web-fragment.xml ;(注意:配置文件的名必须是这...原创 2015-01-11 18:51:16 · 1554 阅读 · 0 评论 -
代理模式
关于Java中的动态代理,我们首先需要了解的是一种常用的设计模式--代理模式,而对于代理,根据创建代理类的时间点,又可以分为静态代理和动态代理。 一、代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代...转载 2018-04-10 08:56:54 · 526 阅读 · 0 评论 -
Dubbo_异常_服务注册运行正常但是Dubbo-Admin看不到服务
一、背景:1、Dubbo服务正常注册到ZooKeeper2、客户端调用Dubbo服务正常二、原因:consumer和provider配置了group信息,但是group不是dubbo,而且在Dubbo-Admin未配置分组信息。由于Dubbo-Admin默认分组是dubbo,所以在监控平台看不到服务。三、解决步骤:1、dubbo.properties添加分组信息:/usr/local/src/to...转载 2018-05-11 10:49:49 · 5318 阅读 · 0 评论 -
java中关于堆(heap)和栈(stack)的那点事
在JVM中,内存分为两个部分,Stack(栈)和Heap(堆),这里,我们从JVM的内存管理原理的角度来认识Stack和Heap,并通过这些原理认清Java中静态方法和静态属性的问题。一般,JVM的内存分为两部分:Stack和Heap。Heap(堆)是JVM的内存数据区。Heap 的管理很复杂,每次分配不定长的内存空间,专门用来保存对象的实例。在Heap 中分配一定的内存来保存对象实例,实际上也只...原创 2015-08-28 22:44:17 · 500 阅读 · 0 评论 -
java IO流分析
Java中的流,可以从不同的角度进行分类。按照数据流的方向不同可以分为:输入流和输出流。按照处理数据单位不同可以分为:字节流和字符流。按照实现功能不同可以分为:节点流和处理流。 输出流: 输入流:因此输入和输出都是从程序的角度来说的。字节流:一次读入或读出是8位二进制。字符流:一次读入或读出是16位二进制。字节流和字符流的原理是相同的,只不过处理的单位不同而已。后缀是Stream是字节流,而后缀是...转载 2015-08-31 23:28:13 · 419 阅读 · 0 评论 -
深入分析Java线程中断问题
Thread.interrupt真的能中断线程吗在平时的开发过程中,相信都会使用到多线程,在使用多线程时,大家也会遇到各种各样的问题,今天我们就来说说一个多线程的问题——线程中断。在java中启动线程非常容易,大多数情况下我是让一个线程执行完自己的任务然后自己停掉,但是有时候我们需要取消某个操作,比如你在网络下载时,有时候需要取消下载。实现线程的安全中断并不是一件容易的事情,因为Java并不支持安...转载 2015-09-05 23:43:51 · 775 阅读 · 0 评论 -
javaWeb中解决中文乱码问题
javaWeb中解决中文乱码问题。网页传值主要有两种情况:1、使用form表单传值 使用form表单传值只要有两种方式:get和post(即:method="get/post",默认是get方式) 1)解决使用post方式传递中文的乱码问题: <form action="login-handler.jsp" method="post"></form>...原创 2015-10-04 10:46:27 · 349 阅读 · 0 评论 -
使用java语言向oracle数据库中存入、取出图片及文件
其实,向数据库中存图片及其他任何文件都是一样的方法,都是用IO流以二进制的方式存入和取出的,本质上跟操作IO流没有什么差别,只是多了一个数据库访问而已。一下程序是我写的两个小Demo,一个存入文件,一个取出文件,没有任何逻辑,仅供参考。目录结构:数据库表结构:create table userimg( id number(8) primary key, pic blob...原创 2015-09-20 13:42:38 · 3534 阅读 · 2 评论 -
java service wrapper导致内存剧增直至崩溃
应用程序使用wrapper包装之后导致内存溢出,直至应用程序崩溃。现象:java应用程序在运行一段时间后把服务器内存耗光,程序死掉,但是守护进程wrapper还活着。虽然java应用程序死了,但是内存还没有被释放,其实实际耗内存的是wrapper,把wrapper的进程kill掉之后服务器的内存马上被释放18G了。分析:在网上查了好多都没有找到类似的情况,最终分析可能是输入的日志太多了导致内存耗尽...原创 2017-03-04 17:33:07 · 3602 阅读 · 0 评论 -
java emoji表情存储解决方案
1.问题产生情况我遇到这个问题是做微信开发的时候有些有用的头像用了微信的emoji表情,然而我的mysql数据库用的编码是utf8_general_ci,就是utf-8编码,结果也就报错误了。2.为什么会出现这种原因因为mysql的utf8编码的一个字符最多3个字节,但是一个emoji表情为4个字节,所以utf8不支持存储emoji表情。但是utf8的超集utf8mb4一个字符最多能有4字节,所以...转载 2017-10-29 16:06:37 · 669 阅读 · 0 评论 -
List在调用add、remove方法后报java.lang.UnsupportedOperationException
今天工作中碰到List对象调用add、remove方法竟然报错,用了好几年了尽然一直没发现,不知道之前写了多少bug。在使用Arrays.asList()后调用add,remove这些method时出现java.lang.UnsupportedOperationException异常。这是由于Arrays.asList() 返回java.util.Arrays$ArrayList,而不是Array...原创 2017-11-14 19:53:28 · 1084 阅读 · 0 评论 -
SimpleDateFormat线程安全问题
使用SimpleDateFormat在多线程下处理日期但得出的结果却是错误的,这是因为SimpleDateFormat方法是非线程安全的。示例代码:class MyThread extends Thread { private SimpleDateFormat sdf; private String dateString; public MyThread(SimpleDat...原创 2017-11-15 21:00:04 · 3477 阅读 · 0 评论 -
几张图轻松理解String.intern()
在翻《深入理解Java虚拟机》的书时,又看到了2-7的 String.intern()返回引用的测试。 其实要搞明白String.intern(),我总结了下面几条规则: 一、new String都是在堆上创建字符串对象。当调用 intern() 方法时,编译器会将字符串添加到常量池中(stringTable维护),并返回指向该常量的引用。二、通过字面量赋值创建字符串(如:String str=”...转载 2018-02-04 19:04:30 · 184 阅读 · 0 评论 -
hadoop完全分布式部署无法访问namenode的8020端口解决方案
遇到的问题:我搭建的是完全分布式系统,克隆了5台虚拟机,1台启动namenode节点,3台启动datanode节点,1台启动secondarynamenode节点,启动start-dfs.sh和start-yarn.sh脚本时,datanode节点日志报错,错误信息:2017-06-03 19:05:39,452 INFO org.apache.hadoop.ipc.Client: Retryin...原创 2017-06-03 19:22:49 · 14584 阅读 · 0 评论 -
@Controller和@RestController的区别
@Controller和@RestController的区别?官方文档:@RestController is a stereotype annotation that combines @ResponseBody and @Controller.意思是:@RestController注解相当于@ResponseBody + @Controller合在一起的作用。1)如果只是使用@RestContr...转载 2017-04-09 18:04:02 · 238 阅读 · 0 评论 -
Spring Boot修改默认Banner
一、自定义banner启动Spring Boot项目时,在控制台或日志中会默认显示一个Banner,如图所示:在我们的项目中更希望使用自己的Banner,这样看起来更帅写,但是这对于程序员来说并不难,只需要修改/src/main/resources/banner.txt里的文本值即可,若该目录下没有banner.txt文件,需要手动创建一个,把里面放上自己想要的值。可以通过该http://pato...原创 2017-03-30 21:29:19 · 9196 阅读 · 0 评论 -
MiniDao实现分库事务
机缘巧合接触到国产轻量级持久层开源框架MiniDao,了解该框架也有一段时间了,但是一直都没有深入的研究底层代码,最近花了一些时间研究了一下实现原理。MiniDao官方提供的版本不支持分布式事务,我在官方的MiniDao-pe-1.6版本上实现了该功能,满足了现有项目的需求。以下具体分析该功能的实现:步骤:一、现有的问题二、深入解析源码,实现分库事务功能三、单元测试一、分析现有的问题在MiniDa...原创 2017-03-26 14:49:10 · 4503 阅读 · 0 评论 -
Freemarker提供了3种加载模板目录的方法
Freemarker提供了3种加载模板目录的方法。 它使用Configuration类加载模板。三种方法分别是:public void setClassForTemplateLoading(Class clazz, String pathPrefix);public void setDirectoryForTemplateLoading(File dir) throws IOException;p...转载 2017-03-17 08:24:44 · 1831 阅读 · 0 评论 -
dubbo优雅关机
需求:生成上dubbo服务在运行时,由于程序原因,应用需要重新打包部署,此时需要重启服务,但是不能影响现有业务的操作。准备:1、每个服务接口至少要部署两个2、简易dubbo监控系统 dubbo-monitor-simple-2.5.3 (dubbo官方提供的)步骤:1、部署简易dubbo监控系统,用于监控dubbo服务(其本身也是一个dubbo服务,默认端口是7070)需要修改conf/dubbo...原创 2017-03-03 15:51:44 · 3157 阅读 · 0 评论 -
Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架,在这种情况下诞生的。现在核心业务抽取出来,作为独立的服务,使前端应用能更快速和稳定的响应。第一:介绍Dubbo背景 大规模服务化之前,应用可能只是通过RMI或Hessian等工具,简单的暴露和引用远程服务,通过配置服务的URL地址进行调用,通过F5等硬件...转载 2015-12-18 17:18:54 · 445 阅读 · 0 评论 -
解决Hibernate4连接MySQL5.5数据库无法自动创建表的问题
hibernate4连接mysql自动创建表的时候出现了错误好长时间不用Hibernate了,最近又重新温习了一下,写了一个hello world 级别的代码,但是怎么都无法创建表,以前也没有碰到这种问题啊,控制台的错误如下:十二月 01, 2015 5:25:01 下午 org.hibernate.annotations.common.Version <clinit>INFO: H...原创 2015-12-01 17:31:54 · 3659 阅读 · 1 评论 -
SpringMVC与struts2的区别比较
1、Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上SpringMVC就容易实现restful url,而struts2的架构实现起来要费劲,因为Struts2中Action的一个方法可以对应一个url,而其类属性却被所有方法共享,这也就无法用注解或其他方式...转载 2015-11-15 19:44:14 · 399 阅读 · 0 评论 -
Java-对象比较器
在Java中要想对两个对象进行比较大小,需要实现Comparable接口或Comparator接口。String类型的值之所以可以比较大小(汉字根据ANSI值的大小进行比较),是因为String类实现了Comparable<T>接口。如果要比较的对象没有实现Comparable接口或Comparator接口而直接比较会报 java.lang.ClassCastException类型转换...原创 2015-05-08 18:04:22 · 696 阅读 · 0 评论