自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

peerless_hero的博客

冠军的心是至死不渝!

原创 BlockingQueue

一、类结构图二、方法除了传统的queue功能(表格左边的两列)之外,还提供了阻塞接口put和take,带超时功能的阻塞接口offer和poll。put会在队列满的时候阻塞,直到有空间时被唤醒;take在队列空的时候阻塞,直到有东西拿的时候才被唤醒。...

2019-12-03 21:03:26 26

原创 如何中断一个线程?

一、了解interrupt、interrupted、isInterruptedpublic void interrupt();Thread#interrupt()并不能真正的中断线程,而是通知线程应该中断了。具体到底中断还是继续运行,应该由被通知的线程自己处理。具体来说,当对一个线程调用interrupt()时:如果线程处于正常活动状态,那么会将该线程的中断标志位设置为true,仅此而...

2019-12-03 00:33:57 61

原创 会计基础理论

一、会计的基本假设会计主体,是指会计工作为其服务的特定单位或组织。持续经营,是指会计主体的生产经营活动将无限期地延续下去,在可以预见的未来,会计主体不会因清算、解散、倒闭而不复存在。会计分期,是指将会计主体持续不断的经营过程,划分为若干等间距的时期,即“会计期间”。《会计法》规定,会计年度自公历1月1日起至12月31日止。会计期间分为年度和中期。中期是指短于一个完整的会计年度的报告期间。...

2019-01-12 17:47:30 209

原创 2018年终考评的反思

2018年的年终考评得了B。领导和我沟通完绩效后,内心是有些焦虑的。心路历程如下,mark一下。个人情况我确实没有投入百分百精力在工作中,2018年我完成了人生的两件大事:买房和结婚。4月份入职新东家后,我在地铁上的时间完全没有利用起来,基本都在玩游戏。每天浪费的时间在两小时。周末也没有再去主动学习。工作情况这里没有产品,需求完全靠自驱。这一年,我几乎全部在进行结算系统的重构。这种...

2019-01-12 15:44:57 159

原创 ZooKeeper在Mac上集群部署

集群模式集群模式有如下两种: 1)使用多台机器,在每台机器上运行一个ZooKeeper Server进程; 2)使用一台机器,在该台机器上运行多个ZooKeeper Server进程。 在生产环境中,一般使用第一种形式。在本地环境中,一般使用第二种形式。下面我们演示下单台机器上如何实现集群部署。下载&解压下载http://mirrors.hust.edu.cn/a...

2018-05-19 16:21:08 2070

原创 disconf回调

disconf可以随时同步配置文件的变化到仓库中。也就是说,配置文件中的参数发生了变化,应用系统会随时获取到最新的参数值。这依靠的是watch+callback机制。Watch第一次扫描时,在开启disconf的情况下,会在zk上建立一个代表配置文件的临时结点,monitorPath形如”/disconf/应用名版本号环境/file/sys-config.properties”。然后便监控这个节点。

2017-11-10 16:30:23 1019

原创 disconf启动流程

如图所示,applicationContext.xml文件中注入了3个和disconf相关的bean。在容器启动的时候,这3个bean将被实例化。 启动流程如下: loadConfig该阶段导入配置,包括:(1)导入系统配置disconf_sys.properties的数据,如果存在系统参数或命令行导入,则覆盖properties文件导入的数据。(2)校验系统配置(3)导入用户配置disconf

2017-11-09 11:37:27 2506

原创 ConcurrentHashMap

ConcurrentHashMap继承于AbstractMap,实现了ConcurrentMap接口,同时标记了Serializable接口。ConcurrentHashMap是线程安全且高效的HashMap常量 /** * Segment数组中的每一个segment的HashEntry[]的初始容量 */ static final int DEFAU

2017-09-24 15:18:31 234

原创 LinkedList

类定义public class LinkedListE> extends AbstractSequentialListE> implements ListE>, DequeE>, Cloneable, java.io.SerializableLinkedList继承了AbstractSequentialList,实现了List、Deque、Cloneable、Java.io

2017-09-03 18:30:41 267

原创 ArrayList

类定义public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.SerializableArrayList继承了AbstractList,实现了List、RandomAccess、Cloneable、Java.io.Serializabl

2017-09-03 16:58:25 270

原创 Spring事务使用场景

常规调用@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)methodA{ …… try{ methodB(); } catch (Exception e) { …… } localA(); ……}@Tra

2017-08-24 10:55:07 6866 2

原创 Cache和Buffer

BufferBuffer(缓冲)主要目的进行流量整形,把突发的大数量较小规模的 I/O 整理成平稳的小数量较大规模的 I/O,以减少响应次数。比如生产者——消费者问题,他们产生和消耗资源的速度大体接近,加一个buffer可以抵消掉资源刚产生/消耗时的突然变化。比如从网上下电影,你不能下一点点数据就写一下硬盘,而是积攒一定量的数据以后一整块一起写,不然硬盘都要被你玩坏了。比如从网络上下载东西,瞬

2017-08-11 17:10:56 160

原创 memcached的内存管理机制

memcached是一个高效的分布式内存cache,默认使用SlabAllocation机制管理内存,其主要思想是按照预先规定的大小,将分配的内存分割成特定长度的块以存储相应长度的key-value数据记录,以完全解决内存碎片问题。 SlabAllocation机制只为存储外部数据而设计,也就是说所有的key-value数据都存储在SlabAllocation系统里,而memcached的其它内存

2017-08-11 15:41:42 250

原创 kafka优点

Kafka是由LinkedIn开发的一个分布式的消息系统,同时支持离线和在线日志处理。Kafka框架本身使用Scala编写,因其可水平扩展和高吞吐率而被广泛使用。目前,越来越多的开源分布式处理系统如Cloudera、Apache Storm、Spark都支持与Kafka集成。 Kafka的持久化方案是写入磁盘,虽然内存读写速度明显快过磁盘读写速度,但Kafka却通过线性读写的方式实现快速读写。 Ka

2017-08-06 16:49:48 1099

翻译 kafka简介

分布式流平台Apache Kafka™是一个分布式流平台,我们认为流式平台(a streaming platform)有以下三个关键的能力: 1.它允许你发布和订阅流记录(streams of records)。从这个角度上说,它接近于一个消息队列或者企业消息系统。 2.它允许你以容错的方式存储流记录。 3.它允许你即时处理消息流。Kafka的优势体现在两大类应用上: 1.构建实时流数据管道

2017-08-06 15:39:27 217

原创 elasticJob分片跑批

业务迅速发展带来了跑批数据量的急剧增加。单机处理跑批数据已不能满足需要,另考虑到企业处理数据的扩展能力,多机跑批势在必行。多机跑批是指将跑批任务分发到多台服务器上执行,多机跑批的前提是”数据分片”。elasticJob通过JobShardingStrategy支持分片跑批。跑批配置需要做如下修改: shardingTotalCount:作业分片总数。jobShardingStrategyClass

2017-08-04 16:06:33 9810 2

原创 java io之文件下载

下面的代码展现了如何从页面上下载服务器上的文件。服务器上文件以windows系统上的HOSTS文件举例。 主要思路是利用FileInputStream获得服务器上文件的句柄,定义一个缓冲区字节数组,每次读一个数组长度的字节到输出设备,直到读完。@RequestMapping(value = "/downloadExistFile.do")public void downloadExistFile

2017-06-09 13:25:18 2563

原创 多线程查询

今天遇到下载资金流水记录的场景。下载的数据源于分页查询,一次5000条。当数据量到达十万级的时候,仅仅通过for循环、每次设置pageNum,查询的等待时间超过了容忍的范围。下面示例展示了采用Callable和Future进行多线程查询并使用CountDownLatch进行多线程同步。// 进行首次查询(略),获取总页数int totalPage;// 设置计数器,从0开始final Coun

2017-05-31 23:47:20 4535 2

原创 dubbo接口访问控制

微服务背景下,一个web应用都可能不再service依赖,而是通过RPC调用远端服务器上的服务。这些服务里,就包括了一些不能轻易暴露的后台功能接口。暴露出去的dubbo接口注册到某一个zk上后,该dubbo接口对注册到该zk上的消费者都是可见的。对公司内部而言,通常不会有人蓄意去调用一些敏感的接口,但也存在人为误用的可能呀。为此,考虑通过白名单机制来控制dubbo接口的访问。现在以许可ip127.0

2017-05-23 22:08:47 15859 1

原创 bean元素的属性

使用Spring框架时,我们经常会在xml文件里装配bean。今天我们认识一下bean元素里的属性都有着哪些用处。 <bean abstract="true" autowire-candidate="default" autowire="default" class="" dependency-check="default" depends-on="" destroy-meth

2017-04-09 22:31:04 1779 3

原创 享元模式

享元模式采用一个共享来避免大量拥有相同内容对象的开销。在《自动装箱和拆箱》一文中提到,JAVA虚拟机启动后将-128~127之间Integer对象缓存起来,这样每次在使用-128~127之间的Integer对象时不用频繁创建,而是直接去缓存池里取。如果缓存池里存在该数值,就直接取出来;如果不存在,则返回新的对象。这种将常用或公共的数据缓存起来反复复用的方式,就体现了享元模式的思想。 publi

2017-04-09 19:15:59 170

原创 自动装箱和拆箱

自动装箱和拆箱是什么在Java中,数据类型可以分为两大类:Primitive Type(原始类型)和Reference Type(引用类型)。基本类型的数值不是对象,不能调用对象的toString()、hashCode()、getClass()、equals()等方法。自动装箱就是Java自动将原始类型值转换成对应的对象,比如将int值转换成Integer对象,这个过程叫做装箱;反之将Integer

2017-04-09 16:49:48 282

原创 MyBatis中批量插入和批量更新

批量插入 <!-- 批量添加资金流水 --> <insert id="batchInsertFlowData" parameterType="java.util.List"> insert into AC_FUND_FLOW_DETAIL (ID, AID, FLOW_CODE, AMOUNT, DEBIT, CREATE_DATE) <foreach

2017-03-31 16:26:37 5627

原创 MyBatis在Oracle中插入数据的返回值

在使用MyBatis做持久层时,insert和update语句默认返回影响行数。可从MyBatis源码中得到证实,如下。 public int update(Statement statement) throws SQLException { PreparedStatement ps = (PreparedStatement) statement; ps.execute();

2017-03-31 15:30:26 5279

原创 Dubbo超时配置

超时机制Dubbo是阿里开源的分布式远程调用方案(RPC),由于网络或服务端不可靠,会导致调用出现一种不确定的中间状态(超时)。为了避免超时导致客户端资源(线程)挂起耗尽,必须设置超时时间。Provider可以配置的Consumer端主要属性有timeout、retries、loadbalance、actives和cluster。Provider上应尽量多配置些Consumer端的属性,让Provi

2017-03-31 14:22:31 30394 1

原创 Maven依赖配置和依赖范围

Maven依赖配置一个dependency的声明可以包含以下元素:<dependencies> <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>0.8.2.2</version> <s

2017-03-06 17:27:32 3434

原创 CAS和ABA问题

CASCAS全称是CompareAndSwap,是一条CPU的原子指令,其作用是让CPU经过比较后原子地更新某个位置的值,CAS是靠硬件实现的,JVM只是封装了汇编调用,那些AtomicInteger类便是使用了封装汇编的接口。我们知道synchronized是一种悲观锁,它使得其它需要锁的线程挂起,等待持有锁的线程释放锁。而乐观锁却不加锁,它假设没有冲突去完成某项操作,如果冲突失败就重试,直到成功

2017-02-17 19:10:20 2135

原创 synchronized

在Java程序运行环境中,JVM需要对两类线程共享的数据进行协调: 1、保存在堆中的对象实例 2、保存在方法区中的Class实例在Java虚拟机中,每个对象和类在逻辑上都和一个监视器相关联。 (1) 对于对象来说,相关联的监视器保护对象的实例变量。 (2) 对于类来说,相关联的监视器保护类的类变量。 (3) 如果一个对象没有实例变量,或者说一个类没有变量,相关联的监视器就什么也不监视。关于

2017-02-16 18:14:31 306 1

原创 对象创建、内存布局和访问定位

对象创建在语言层面上,创建对象通常仅是一个new关键字而已,而在虚拟机中,对象的创建又是怎样一个过程呢?虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用。如果没有,则先执行相应的类加载过程。为新生对象分配内存,对象所需内存的大小在类加载完成后便可完全确定,那么为对象分配空间的任务等同于把一块确定大小的内存从Java堆中划分出来。分配方式有以下两种,选择

2017-02-12 20:10:06 182

原创 Java虚拟机运行时数据区

Java虚拟机在执行Java程序的过程中会把它管理的内存划分为若干个不同的数据区域。这些数据区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些则依赖用户线程的启动和结束而建立和销毁。Java虚拟机所管理的内存包括以下几个运行时数据区域: 这些运行时数据区域的访问属性、内存配置参数和描述如下: 关于内存配置参数 - -Xms:表示java虚拟机堆区初始内存分配的

2017-02-12 17:57:28 154

原创 垃圾收集器

如果说收集算法是内存回收的方法论,那么垃圾回收器就是内存回收的具体实现。 不同厂商、不同版本的虚拟机所提供的垃圾收集器可能有很大差别,并且一般会根据应用特点和要求组合出各个年代所使用的收集器。 HotSpot虚拟机包含的收集器如下图: 各个垃圾回收器的回收算法、组合方式、应用场景如下图: 先详细说一下CMS收集器运作的大致步骤: 1. 初始标记阶段(CMS initial mark):标记

2017-02-10 16:44:33 132

原创 HashMap

HashMap继承于AbstractMap,实现了Map接口,同时标记了Cloneable和Serializable接口。public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable构造函数HashMap提供了四个构造函数: (1) HashMap():

2017-02-05 16:11:16 270

原创 Mybatis插入时间没有时分秒只有年月日

起因前几天单元测试发现,数据库中的日期类型字段只插入了不带时分秒的值。 Debug下来确认,入库前实体字段里存的时间值是正常的,立即猜测问题出在Mybatis里。xxxMapper.xml里是这么写的,<if test="timeJoin != null">TIME_JOIN = #{timeJoin, jdbcType = DATE},</if>推测目测错误就是由”jdbcType = DATE

2017-01-19 20:57:53 13952 2

原创 Java读取文件数据

晚上在研习循环结构程序设计[注]的时候,有一节是关于文件操作的。要求从文件中读入数据,求出它们的最小值、最大值和平均值。入门算法对我们不是问题,不过文件读取还是值得写一下的。 注:相关PDF下载地址是http://download.csdn.net/detail/peerless_hero/9736266BufferedReaderBufferedReader继承于Reader,它从字符输入流中读

2017-01-13 00:16:57 393

原创 Spark核心--RDD

RDDRDD(Resilient Distributed Datasets)即弹性分布式数据集,它是Spark的核心概念,我们从以下几点来理解它: 1. RDD由多个Partition构成,是分布在集群中的只读对象的集合。 2. RDD存储在磁盘或内存中,Spark提供了多种RDD缓存级别。 3. RDD可通过并行”转换”操作进行构造。 4. RDD失效后会自动重构。如下图所示,RDD有三个

2017-01-12 21:59:30 267

原创 Spark运行模式

我们先看一个完整的实例wordcountimport org.apache.spark._import SparkContext._object WordCount { def main(args: Array[String]) { if (args.length != 3 ){ println("usage is org.test.WordCou

2017-01-12 00:02:14 337

原创 Spark概述

Spark产生背景一:MapReduce局限性说起Spark的产生背景,就得说一下MapReduce的局限性。仅支持Map和Reduce两种操作。MapReduce处理效率低,体现在: (1) Map阶段会将中间结果写入磁盘, Reduce阶段会将运算结果写入HDFS,多个MR任务之间通过HDFS交换数据。 (2) 任务调度和启动开销大。 (3) MapReduce无法充分利用内存。 (

2017-01-11 18:24:11 446

原创 Java反射获取父类中的元素

我们知道,可以通过getDeclaredField和getField方法可以反射获取class中的元素,他们的区别在于getField只能访问公有变量,而getDeclaredField则可以访问定义的所有变量,包括protected修饰和private修饰的变量。 // 1.getDeclaredField方法调用searchFields方法 Field field = search

2017-01-06 19:08:45 3104

原创 Collection集合概览

Container taxonomy上图是Java容器分类图,初看这张图可能会有点庞大,但是实际上只有三个组件:Map, List, and Set。 我们解读一下其中的组件: 1.黑色粗线框所代表的是我们常用的容器组件,包括HashMap、HashSet、ArrayList和LinkedList。 2.点框代表的是接口。 3.虚线框代表了抽象类。 4.实线框是常规的实现类。 5.空心箭

2016-12-26 17:42:36 179

原创 Spring事务管理

一、Transactional注解中的常用参数public @interface Transactional { String value() default ""; // 该属性用于设置事务的传播行为 Propagation propagation() default Propagation.REQUIRED; // 该属性用于设置底层数据库的事务隔离级别,事务隔离级别

2016-12-20 19:51:04 212

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