Java
文章平均质量分 93
Nicolos_Z
千里之堤,溃于蚁穴.
展开
-
一文读懂MVCC实现原理
Mysql MVCC详解原创 2022-03-20 22:00:42 · 14346 阅读 · 2 评论 -
JAVA线程池的那些事儿
线程池的ThreadPoolExecutor实现了Executor接口:参数最全的构造方法如下:public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue workQueue,ThreadFactory threadFactory,R...原创 2020-03-19 13:40:46 · 260 阅读 · 0 评论 -
基于Lua脚本实现Redis分布式锁(乐观锁)
使用redis调用lua脚本实现原子性操作如果对redis提供的指令集不满足 可以通过lua脚本执行自定义操作来保证执行的原子性,比如实现将匹配 key 和删除 key 合并在一起执行等。Redis 服务器会单线程原子性执行 lua 脚本,保证 lua 脚本在处理的过程中不会被任意其它请求打断。public class RedisLock { private Jedi...原创 2019-12-31 17:01:23 · 904 阅读 · 0 评论 -
JAVA中的矩阵相乘(Math3的使用)
math3简介math3是Apache下的一款进行数学计算的一款java开源工具。jar包名称为:commons-math3-3.6.1.jar。大家可以通过maven或者其他网站进行下载。math3是一款非常好用的工具,里面提供了各种运算的方法及类,方便大家调用。其API文档为:http://commons.apache.org/proper/commons-math/jav原创 2017-10-24 08:01:23 · 4126 阅读 · 2 评论 -
JAVA中常用的高级集合类总结(包含Concurrent包下的并发集合类)
MAPWeakHashMap 和普通的HashMap相比,当除了自身有对key的引用外,此key没有其他引用那么此map会自动丢弃此值,从而解决HashMap对象中key-value资源无法释放,导致内存泄露。WeakHashMap的key采用的是弱引用。只要key不被外部引用,就会被回收。HashMap则相反。ConcurrentHashMap 线程安全,采用了分段锁的设计,原创 2017-10-24 08:15:01 · 1821 阅读 · 0 评论 -
JVM类加载机制详细解析
类的生命周期: 加载->链接(验证->准备->解析)->初始化->使用->卸载 (连接阶段Linking)1、加载:加载过程主要完成的3件事情: >>通过类的全限定名来获取定义此类的二进制字节流。 >>将字节流所代表的静态存储结构转化为方法区的运行数据结构。原创 2017-10-25 15:03:03 · 333 阅读 · 0 评论 -
JAVA GWT 自定义可拖拽PopupPanel
自定义组件:DragDropPopupPanelpublic class DragDropPopupPanel extends FlowPanel { final Button caption = new Button(); final Button closebtn = new Button("X"); final HorizontalPanel hp = new Horizont原创 2017-12-13 11:19:32 · 521 阅读 · 0 评论 -
Java8新特性-Lambda表达式以及stream详解
1) 函数式接口: 如何一个接口只包含一个抽象方法那么这个接口就是函数式接口如:Callable Runnable Comparator .etc 可以通过@FunctionalInterface 注解标识函数式函数式接口(非必须--但是建议) 添加该注解后,如果在接口添加第二个方法编译器会报错。 但是函数式接口允许多个静态方法或者默认原创 2017-12-25 14:19:03 · 407 阅读 · 0 评论 -
java.util.concurrent下同步辅助类CyclicBarrier
CyclicBarrier--同步辅助类,它允许一组线程相互等待,直到到达某个公共屏障点(common barrier point),在涉及一组固定大小的线程的程序中,这些线程必须不时的互相等待,此时CyclicBarrier很有用,它会等待所有线程都准备好后,释放所有线程同时执行。并且CyclicBarrier可以多次循环使用。示例代码如下:package com.zn.seni...原创 2018-02-09 19:14:32 · 326 阅读 · 0 评论 -
java.util.concurrent下同步辅助类Semaphore
Semaphore其字面意思是信号量,该信号量维护了一个许可集合,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。 Semaphore有公平和非公平之分,可以通通过构造方法指定,具体使用和相关介绍请参考下面的事例代码: package com.zn.senior.queue;import java.util.concurren...原创 2018-02-10 16:09:18 · 357 阅读 · 0 评论 -
java.util.concurrent包下同步辅助工具类CountDownLatch
CountDownLatch作为一个辅助工具类,它允许一个或多个线程等待一系列指定操作的完成。CountDownLatch以一个给定值进行初始化,通过CountDownLatch cdl = new CountDownLatch(n); 通过cdl.await()方法进行阻塞,并等待计数器的值被减到0,其他线程每调用一次cdl.countDown方法,该计数器的值就会-1,等待计数...原创 2018-02-09 17:24:35 · 344 阅读 · 0 评论 -
Java开发中的几种对象的说明(PO,VO,DTO,BO,POJO,DAO,SAO等)
一、PO :(persistant object ),持久对象可以看成是与数据库中的表相映射的java对象。使用Hibernate来生成PO是不错的选择。二、VO :(value object) ,值对象通常用于业务层之间的数据传递,和PO一样也是仅仅包含数据而已。但应是抽象出的业务对象,可以和表对应,也可以不,这根据业务的需要.PO只能用在数据层,VO用在商业逻辑层和表示原创 2017-03-15 22:09:13 · 6688 阅读 · 1 评论 -
深入理解JVM-JAVA高级特性与最佳实践
对JAVA程序员来说JAVA虚拟机可以说既熟悉又神秘,很少有JAVA程序员能够抑制自己探究它的冲动。本文源自《深入理解Java虚拟机》并对该书核心内容精炼总结,持续更新...运行时数据区域1、程序计数器 当前线程所执行的字节码的行号指示器2、JAVA虚拟机栈 线程私有,生命周期与线程相同,每个方法在执行的同时会创建一个栈帧用于存储局部变量表,操作数栈等。每个原创 2017-10-03 09:47:49 · 340 阅读 · 0 评论 -
高并发后端设计之《限流》
系统在设计之初就会有一个预估容量,长时间超过系统能承受的TPS/QPS阈值,(其中TPS是每秒内的事务数,比如执行了dml操作,那么相应的tps会增加;QPS是指每秒内查询次数,比如执行了select操作,相应的qps会增加)系统可能会被压垮,最终导致整个服务不够用。为了避免这种情况,我们就需要对接口请求进行限流。 限流的目的是通过对并发访问请求进行限速或者一个时间窗口内的的请求数量进原创 2017-10-17 21:19:48 · 722 阅读 · 0 评论 -
Zookeeper之Java API 简单应用
package com.zn.zookeeper;import java.util.List;import org.apache.zookeeper.CreateMode;import org.apache.zookeeper.KeeperException;import org.apache.zookeeper.WatchedEvent;import org.apache.zooke原创 2017-02-10 21:40:08 · 321 阅读 · 0 评论 -
使用JavaAPI操作hadoop hdfs <一>
package com.zn.hadoop;import java.net.URI;import java.util.Iterator;import java.util.Map.Entry;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.FileStatus;import org.apa原创 2017-02-13 19:59:57 · 506 阅读 · 0 评论 -
深入理解JVM之JVM内存区域与内存分配
JAVA虚拟机把管理的内存划分为几个不同的数据区。Java堆-存放new的对象和数组(jvm不定时查看这个对象,如果没有引用指向这个对象就回收)Java堆是被所有线程共享的一块内存区域,主要用于存放对象实例,Java虚拟机规范中有这样一段描述:所有的对象实例和数据都要在堆上进行分配。为对象分配内存方式:指针碰撞法(内存完整时)、空闲列表法原创 2017-02-07 17:00:06 · 8965 阅读 · 1 评论 -
Java线程池详解
线程池类为 Java.util.concurrent.ThreadPoolExecutor,常用构造方法为:// new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, handler) /** * @author ning * * coreP原创 2017-02-04 17:00:33 · 340 阅读 · 0 评论 -
SpringMVC 三种处理器映射器配置方式
当用户通过URL发来请求、在Controller 层 springmvc 要根据配置文件来决定哪一个Controller 对象处理该请求。该过程是通过处理器映射器HandlerMapping类来决定。下面我们介绍常用的三种配置方式:方式一:通过BeanNameUrlHandlerMapping 也就是根据url请求去匹配bean的name属性url,从而获取Controller。Spr原创 2017-02-25 22:39:07 · 2758 阅读 · 0 评论 -
ArrayList、LinkedList、HashSet、TreeSet间的区别和联系。
Collection |--List:元素是有序的,元素可以重复。因为该集合体系有索引。 |--ArrayList:底层的数据结构使用的是有序数组结构。特点:查询速度很快O(1)。但是增删稍慢O(n)。线程不同步。 |--LinkedList:底层使用的链表数据结构。特点:增删速度很快O原创 2017-02-27 13:57:36 · 3318 阅读 · 0 评论 -
HashMap和HashTable的区别
HashMap和HashTable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别。主要的区别有:线程安全性,同步(synchronization),以及速度。HashMap几乎可以等价于HashTable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)和值(value),而HashTable则不行)。H原创 2017-02-27 10:50:54 · 283 阅读 · 0 评论 -
高吞吐低延迟Java应用的垃圾回收优化
高性能应用构成了现代网络的支柱。LinkedIn有许多内部高吞吐量服务来满足每秒数千次的用户请求。要优化用户体验,低延迟地响应这些请求非常重要。比如说,用户经常用到的一个功能是了解动态信息——不断更新的专业活动和内容的列表。动态信息在LinkedIn随处可见,包括公司页面,学校页面以及最重要的主页。基础动态信息数据平台为我们的经济图谱(会员,公司,群组等等)中各种实体的更新建立索引,它必须高吞原创 2017-05-19 21:27:14 · 530 阅读 · 0 评论 -
HashMap全面分析及JDK8对HashMap的相关优化
简介Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMap、Hashtable、LinkedHashMap和TreeMap,类继承关系如下图所示:下面针对各个实现类的特点做一些说明:(1) HashMap:它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序转载 2017-10-08 09:40:38 · 5280 阅读 · 3 评论 -
ArrayBlockingQueue和LinkedBlockingQueue的区别及使用
BlockingQueue接口定义了一种阻塞的FIFO queue,每一个BlockingQueue都有一个容量,让容量满时往BlockingQueue中添加数据时会造成阻塞,当容量为空时取元素操作会阻塞。ArrayBlockingQueue是一个由数组支持的有界阻塞队列。在读写操作上都需要锁住整个容器,因此吞吐量与一般的实现是相似的,适合于实现“生产者消费者”模式。LinkedBlock原创 2017-02-04 16:56:22 · 21318 阅读 · 3 评论