
[JAVA]
文章平均质量分 91
Holmofy
奋斗中的小菜鸟
展开
-
从notify和metaq初窥消息队列的前世今生
上一家公司并没有用消息队列中间件,大学里对ActiveMQ有所了解但并未深入研究,RocketMQ、Kafka也一直囿于听闻。不过在原来的项目中经常会用Redis的list实现一个分布式的阻塞队列。在短信服务调用中,会将服务的同步调用改为异步任务存入队列表批量调度以提高吞吐量,并降低大促期间大批量短信同步调用带来的压力。我觉得后面这一点也非常接近消息队列所要实现的需求。然后受益于隆基前辈的阿里消息...原创 2020-04-27 21:50:46 · 804 阅读 · 0 评论 -
Spring-IOC整体设计与源码分析
最近读完《Spring技术内幕》一书,虽然此书评价貌似不高,但边看书边读源码,感觉还是有点收获,至少为阅读Spring源码提供了思路。然后这篇文章就记录一下这几天看Spring IOC这块的源码以及整体思路。1、 BeanFactory与ApplicationContext在Spring的IOC容器设计中,主要由两个容器系列:实现BeanFactory接口的简单容器,提供了完整IoC容器服...原创 2020-03-07 18:15:49 · 589 阅读 · 0 评论 -
RMI简单示例
RMI是Java1.1中实现的一种RPC通信机制。使用RMI可以让一个Java虚拟机中的对象调用另外一个虚拟机中对象的方法,它大大增强了Java开发分布式应用的能力。这篇文章使用RMI实现一个简单的例子。服务端代码1.声明一个服务接口,提供给远程调用,该接口必须继承自java.rmi.Remote接口。package cn.hff.service;import java...原创 2017-12-23 18:00:49 · 1180 阅读 · 0 评论 -
Java多线程复习与巩固(八)--原子性操作与原子变量
前面讲线程同步时,我们对多线程出现的问题进行了分析,在那个例子中,问题的根源在于c++和c--这两个操作在底层处理的时候被分成了若干步执行。当时我们用的是synchronized关键字来解决这个问题,而从synchronize的实现原理中我们知道synchronized通过monitor监视器来实现线程同步,这种同步方式要求线程等待monitor的拥有者线程释放后,才可能进一步执行,而线程等待可能...原创 2017-06-26 18:13:13 · 747 阅读 · 0 评论 -
Java多线程复习与巩固(六)--线程池ThreadPoolExecutor详解
1. 为什么要使用线程池线程创建与销毁都耗费时间,对于大量的短暂任务如果仍使用“创建->执行任务->销毁”的简单模式,将极大地降低线程的使用效率(一个线程仅仅处理一个短暂的任务就被销毁了)。在这种情况下,为了提高线程的使用效率,我们使用缓存池的策略让线程执行任务后不立即销毁而是等待着处理下一个任务。2. 使用Executors工具类创建线程池Executors是线程池框原创 2017-08-19 14:16:38 · 5129 阅读 · 3 评论 -
Java多线程复习与巩固(二)--线程相关工具类Timer和ThreadLocal的使用
定时器(Timer类)如果我们需要让某个任务在另一个线程中周期性的执行,或者让它在某个时刻执行一次。这时我们可能会写这样的代码:周期任务:// 周期任务public class PeriodTask implements Runnable{ private long period = 1000; private boolean running = true; ...原创 2017-06-14 21:21:43 · 904 阅读 · 0 评论 -
Java多线程复习与巩固(一)--线程基本使用
进程与线程在并发编程中,有两个基本的执行单元:进程和线程。在Java中,并发编程主要关心的是线程。当然,进程也很重要。进程(Process)进程有独立的执行环境,一个进程有一套私有的、完整的运行时资源,比如:每个进程都有自己的内存空间。进程通常会被认为是一个应用程序的代名词。但实际上一个应用程序可能会包含多个协同工作的进程。比如你电脑里的360打开后肯定有两个或两个以上的进程:...原创 2017-06-14 15:27:20 · 1009 阅读 · 0 评论 -
EffectiveJava读书笔记- 第4条:通过私有构造器强化不可实例化的能力
通过私有构造器强化不可实例化的能力上一条讲单例的时候已经提到了私有化构造器。单例模式这么搞是为了保证全局只有一个实例,而这一条规则是为了让工具类一个实例都无法创建。这样的例子在JDK中有很多:java.util.Collections,java.util.Arrays,java.util.concurrent.Executors,java.util.Objects,java.util.st...原创 2018-02-17 20:11:33 · 459 阅读 · 0 评论 -
Shiro认证与授权源码分析
这里使用官方提供的demo进行调试,进入源码分析。官方demo地址:https://github.com/apache/shiro/tree/master/samples/quickstartpublic class Quickstart { private static final transient Logger log = LoggerFactory.getLogger...原创 2018-01-04 17:11:13 · 1595 阅读 · 0 评论 -
自旋锁公平性的三种实现
随着多核处理器的爆炸式增长,多线程同步访问共享内存的性能也成了计算机系统发展的关键。在《互斥锁与自旋锁》这篇文章中我们提到了互斥锁与自旋锁之间的区别以及各自的优点和适用场景。普通自旋锁的实现我们适用Java代码来实现一个简单的自旋锁:import java.util.concurrent.atomic.AtomicBoolean;public class Spinlock ...原创 2017-07-17 00:14:16 · 3511 阅读 · 0 评论 -
EffectiveJava读书笔记- 第3条:用私有构造器或者枚举类型强化Singleton属性
用私有构造器或枚举类型强化Singleton属性单例模式(Singleton Pattern)无疑是笔试面试中被问得最多的问题之一。单例模式虽然看似简单,但是仍有很多东西值得思考。GOF是这么定义单例模式的: 确保一个类只有一个实例,并提供一个全局访问点。通常实现单例都需要我们私有化构造器,让对象无法在外部创建,同时提供一个外部访问的方法返回这个单例对象。通常单例分为两大...原创 2018-02-16 21:55:27 · 642 阅读 · 0 评论 -
EffectiveJava读书笔记- 第2条:遇到构造器有多个参数时要考虑用构建者模式
遇到构造器有多个参数时要考虑用建造者模式静态工厂方法和构造器都有一个局限性:当构造的对象有大量的可选参数时,你可能需要定义很多个静态工厂方法或者构造器。用setter方法替代多参数构造器的几个缺点书中提到多参数的构造器的一个替代方法,就是用JavaBean模式:使用无参构造器创建对象,然后调用setter方法设置每个必要参数以及一些可选参数。1. 构造的过程中,对象可能处于不一...原创 2018-02-13 17:09:43 · 333 阅读 · 0 评论 -
Java多线程复习与巩固(九)--volatile关键字与CAS操作
前一篇文章中提到原子操作,也许大家和我一样很好奇为什么AtomicInteger.increment方法能保证原子性,而简单的++运算却不能保证原子性。这篇文章我们就从AtomicInteger类下手分析源码,来了解一下原子操作的实现原理,但是分析源码之前需要来一段小小的前奏。CPU内存架构现代计算机都是多处理机CPU,每个核心(Core)都有一套寄存器,CPU访问寄存器的速度是最快的...原创 2017-06-27 23:16:48 · 5160 阅读 · 0 评论 -
Java多线程复习与巩固(七)--任务调度线程池ScheduledThreadPoolExecutor
强烈建议看本文之前,先把《Java多线程复习与巩固(六)–线程池ThreadPoolExecutor》看完。首先因为ScheduledThreadPoolExecutor继承自ThreadPoolExecutor,不了解ThreadPoolExecutor的原理看本文可能会有些吃力;另外本文的行文思路会按照《Java多线程复习与巩固(六)–线程池ThreadPoolExecutor》的顺序进...原创 2018-02-22 00:07:34 · 1562 阅读 · 0 评论 -
Java I/O流总结与巩固
字节流字节流就是每次以8位一个字节的方式执行输入输出。所有字节流都继承自InputStream或OutputStream,包括字符流在内的所有类型的I/O流都是基于字节流构建的。字节输入流InputStream字节输入流基本上都需要实现InputStream这个抽象类的方法: 方法摘要 备注 public abstract int read() thr...原创 2017-05-22 14:51:18 · 836 阅读 · 0 评论 -
SpringDataRedis踩坑记录
这几天做的功能涉及到Redis缓存,踩了不少坑,这里记录下来。1、SpringBoot自动配置的RedisTemplate在SpringBoot中可以在``properties配置文件中配置[spring.redis.*`相关属性](https://docs.spring.io/spring-boot/docs/2.1.3.RELEASE/api/org/springframework/boo...原创 2019-02-21 01:15:56 · 924 阅读 · 0 评论 -
垃圾回收算法与JVM内存管理
因为之前公司有人分享过G1回收器的内容,很多人听的云里雾里(包括我)。甚至有人问学GC有什么用,对写代码有帮助吗。我想这个问题不可置否。《深入理解Java虚拟机》一书中有这么一句话:Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来。这篇文章的目的就是为了突破这座藩篱,尽量让更多的人理解JVM的垃圾回收机制。1、GC之前早在1960...原创 2018-12-06 17:47:08 · 831 阅读 · 3 评论 -
ForkJoinPool入门篇
《线程池ThreadPoolExecutor详解》和《任务调度线程池ScheduledThreadPoolExecutor》两篇文章将ThreadPoolExecutor和ScheduledThreadPoolExecutor两个核心线程池已经详细介绍过了,它们整体的工作结构如下图所示。这篇文章将介绍最后一个线程池——Java7中最引人瞩目的ForkJoinPool线程池。1. 为...原创 2018-09-16 14:57:33 · 12427 阅读 · 2 评论 -
使用POI解析Excel
Excel作为一种常用的数据存储格式,在很多项目中都会有相应的导入导出的功能。这篇文章会介绍如何使用Java操作Excel,以及如何解决大文件读写时内存溢出的问题。1、OpenXML标准Word、Excel、PPT是Office办公套件中最常用的三个组件。早期的Office套件大都使用二进制格式,也就是最常见以.doc、.xls、.ppt为后缀的文件;直到07这个划时代的版本将基于XM...原创 2018-09-08 19:07:35 · 27143 阅读 · 1 评论 -
ThreadPoolExecutor最佳实践--如何选择队列
前一篇文章《如何选择线程数》讲了如何决定线程池中线程个数,这篇文章讨论“如何选择工作队列”。再次强调一下,ThreadPoolExecutor最核心的四点:1、当有任务提交的时候,会创建核心线程去执行任务(即使有核心线程空闲);2、当核心线程数达到corePoolSize时,后续提交的都会进BlockingQueue中排队;3、当BlockingQueue满了(offer失败),就...原创 2018-08-12 20:55:45 · 6116 阅读 · 0 评论 -
ThreadPoolExecutor最佳实践--如何选择线程数
去年的一篇《ThreadPoolExecutor详解》大致讲了ThreadPoolExecutor内部的代码实现。总结一下,主要有以下四点:当有任务提交的时候,会创建核心线程去执行任务;当核心线程数达到corePoolSize时,后续提交的都会进BlockingQueue中排队;当BlockingQueue满了(offer失败),就回创建临时线程;当线程总数达到maximumPoo...原创 2018-07-29 15:47:05 · 16160 阅读 · 4 评论 -
Tesseract与tess4j验证码识别
验证码,英文名CAPTCHA,全称叫做:全自动区分计算机和人类的图灵测试。验证码主要为了防一些不怀好意的人(程序猿),避免批量注册账户,暴力尝试多次登录失败等一些恶意行为。最经典的就是文字型的验证码:简单的文字型验证码容易被OCR识别,所以程序猿们让文字随机旋转、扭曲、黏连,在验证码上加干扰线、加噪点以降低自动化程序的识别率,但是很多扭曲变形的文字连人都识别不出来,比如中国移动这个验证...原创 2018-06-30 15:48:54 · 6190 阅读 · 0 评论 -
Struts2怎么使用OGNL的
这几天整理笔记,发现了以前的几篇文章没发出来在之前的一篇文章中我们看到了OGNL的强大功能。 OGNL并不是专门为Struts2框架而设计的,它是用于获取和设置Java对象属性的一种独立的表达式语言。 所以在看这篇文章之前建议先把之前的一篇文章看完。Struts2框架就是使用OGNL完成数据的设置与访问的:数据访问主要体现在JSP页面中我们可以使用OGNL表...原创 2018-03-17 18:12:48 · 847 阅读 · 0 评论 -
A Java Fork/Join Framework
原文链接:A Java Fork/Join Framework(PDF) - Doug Lea 基于并发编程网 – ifeve.com上 Alex/萧欢 翻译、方腾飞 校对的译文稿:Java Fork Join 框架 译文发在并发编程网 – ifeve.com:Java Fork/Join框架, 2017-11-02Java Fork/Join框架...翻译 2018-02-24 14:06:34 · 727 阅读 · 0 评论 -
EffectiveJava读书笔记- 第1条:考虑用静态工厂方法代替构造器
考虑静态工厂方法代替构造器静态工厂方法相对于构造器的好处:1. 静态工厂方法有名字,相比构造器创建的对象更语义化最好的例子就是并发库中的Executors工具类了。Executors中有多个创建线程池的方法:public static ExecutorService newFixedThreadPool(int nThreads);public static Execut...原创 2018-02-12 23:30:26 · 394 阅读 · 0 评论 -
常见排序算法及JAVA实现
排序算法的分类先看维基百科中的一张关于排序算法的表 我们主要了解常见的一些排序算法。像Bogo排序,臭皮匠排序这类完全不实用的排序可以置之不理。 我们这里要说的排序算法都是内排序,也就是只在内存中进行,涉及到对磁盘等外部存储设备中的数据进行排序称之为外排序,关于外排序的内容可以查看维基百科。其实外排序使用的是归并排序的思想。简单选择排序(SelectSort)选...原创 2017-04-19 22:01:01 · 5165 阅读 · 5 评论 -
Java多线程复习与巩固(五)--生产者消费者问题(第一部分)
生产者消费者问题(第一部分)生产者消费者问题也称为有限缓冲问题,是线程同步的一个经典问题:生产者线程和消费者线程共享一块固定大小的缓存,生产者负责生成产品然后存入共享缓冲区中,消费者负责从共享缓冲区中取出产品进行消费。该问题的关键在于生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区空时消耗数据。要解决这个问题就必须:让生产者在缓冲区满时休眠,等到下次消费者消耗缓冲区中的数据的时候,生产...原创 2017-08-01 19:56:18 · 940 阅读 · 0 评论 -
Java多线程复习与巩固(四)--synchronized的实现
小小的回顾在上一篇文章的例子中有一个Counter类:static class Counter { private int c = 0; public void increment() { c++; } public void decrement() { c--; } public int value() { return c; }}为了实现线程同...原创 2017-06-15 20:46:36 · 991 阅读 · 0 评论 -
Java多线程复习与巩固(三)--线程同步
多线程容易出现的问题因为一个进程内,多个线程线程共享该进程的资源,而进程之间,资源的获取是互斥的,所以线程间通信比进程间通信更简单。我们可以直接通过共享资源的访问来实现线程间通信,这种通信方式十分有效(速度快),但也容易产生错误,如:线程干扰和内存一致性错误。看一下下面这个例子:这个程序有两个线程,一个线程对计数器进行10000次加一操作,一个线程对计数器进行10000次减一操作,两个线程...原创 2017-06-14 23:56:11 · 1070 阅读 · 3 评论 -
安卓常用第三方框架-FastJson
简介上次我们讲到Google的Gson库,作为国际大公司的阿里巴巴也不敢示弱,出了一款号称速度最快的Fastjson,这里有第三方给出的测试结果https://github.com/eishay/jvm-serializers/wiki, 虽然FastJson在Github上戏称Gson的“G”是“龟速”的意思,但FastJson在文档方面确实做得不如Gson(没办法天朝软件行业的通病)。废话...原创 2017-02-17 22:51:17 · 3324 阅读 · 0 评论 -
安卓常用第三方框架-Gson
Gson简介json因其轻量、高效等特性,而被广泛用作移动开发的信息交互的载体。 我们知道AndroidSDK提供了org.json工具包来解析Json数据,但是仍然避免不了解析过程中的一系列重复工作。所以就出现了许多第三方JSON解析框架。JSON官方网站也给我们列出了在各种语言中JSON的解析策略: 可以看到java语言中解析JSON的库有很多,但由于移动设备硬件与软件等各方面的因...原创 2017-02-17 20:59:35 · 1205 阅读 · 0 评论 -
解决FastJson的$ref循环引用检测的问题
今天帮小黑解决问题的时候碰到的问题,感谢原作者的分享 原文章链接:https://www.cnblogs.com/zjrodger/p/4630237.html【需求与环境描述】0、开发环境 SSH,EasyUI,MySQL1、需求要求: (1)首先获取所有的贷款订单数据,即List 。 (2)然后从单个贷款订单实体LoanOrder去访问贷款人实体Lo...转载 2017-11-14 13:17:41 · 1784 阅读 · 2 评论 -
Spring整合阿里云OSS服务实现文件上传
相关配置在阿里云控制台生成访问密钥(AccessKey)创建OSS bucket。 阿里云提供了Endpoint(是阿里云自己的域名)。数据库中存储的文件地址如果包含阿里云的域名,将来如果不使用阿里云(使用其他的云服务,或者是自己搭建图片服务器),那么数据库中的地址全部要修改(这里面包括富文本内容,修改富文本内容中的图片地址复杂程度可想而知)。 域名解析选择CNA...原创 2018-01-19 09:01:59 · 2031 阅读 · 0 评论 -
Tomcat编码问题详解
J2EE服务端开发编码问题主要集中在两个地方:JSP页面和Servlet程序。JSP页面:<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" language="java" %><html><head> <meta charset="UTF-8"> <title>编码问题</title></he原创 2017-09-22 22:16:38 · 1794 阅读 · 0 评论 -
Java国际化主题大合集
Java提供给我们软件国际化的解决方案,这些国际化API基于Unicode标准,并且包括文本、(货币)数字、日期以及用户自定义对象的适配,从而使得软件能够应用到任何国家或地区。国际化英文为“Internationalization”,通常简写成i18n(实际开发经常使用简写)。更多有关Java国际化的内容可以参考Oracle的相关网站。文字国际化Java语言基于Unicode字符集。Unicode是原创 2017-08-05 19:43:04 · 2234 阅读 · 0 评论 -
SpringMVC源码浅析
先来看一张整体的处理过程图: 下面的Spring源码版本为4.3.12,是目前最新的稳定版本。 源码版本不一致,可能会有稍许差异。DispatcherServlet.doDispatcher()先看一下DispatcherServlet方法的核心方法doDispatch:protected void doDispatch(HttpServletReque...原创 2017-12-25 21:51:21 · 617 阅读 · 0 评论 -
Hessian初体验
前面两篇文章写了一个RMI的例子并简单分析了一下RMI的原理。这里简单概括一下RMI的优缺点;优点:面向对象的远程服务模型;客户端可以像调用本机对象一样去调用远程对象的方法。基于TCP协议,执行速度非常快。缺点:使用Java特有的序列化协议JRMP,不能使用在多语言实现的异构系统上。在J2EE中WebService使用SOAP协议解决了异构系统通信的问题。因为SO...原创 2017-12-24 15:13:56 · 476 阅读 · 0 评论 -
单轴快排(SinglePivotQuickSort)和双轴快排(DualPivotQuickSort)及其JAVA实现
快速排序使用的是分治思想,将原问题分成若干个子问题进行递归解决。通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。单轴快排(SinglePivotQuickSort)单轴快速排序是快速排序最简单的实现。步骤如下:如果待排序的数组...原创 2017-05-04 13:11:21 · 12814 阅读 · 11 评论 -
Java Collection框架概述
集合接口概要:List (since 1.2)Vector(since 1.0):Stack(since 1.0):ArrayList(since 1.2):LinkedList(since 1.2):CopyOnWriteArrayList(since 1.5,concurrent):Map (since 1.2)Hashtable(since 1.0):Pro...原创 2017-05-05 16:52:59 · 2408 阅读 · 0 评论 -
关于Java
关于JavaJava既是编程语言又是平台。Java编程语言Java编程语言是一种高级语言,具有以下的几种特性:简单(相对于C/C++这类语言)面向对象(而且是纯面向对象)跨平台(只要该平台有JRE就可以运行Java程序)分布式(Java的RMI机制是目前分布式技术中最成熟的)高性能(Java是编译解释混合的语言,比Python,Javascript这类解释型语言效率高...原创 2017-05-17 22:30:58 · 547 阅读 · 0 评论