java
文章平均质量分 72
归海一刀之渔舟唱晚
这个作者很懒,什么都没留下…
展开
-
一个字段首字母大小写引发空值
一.引言 昨天同事反馈热配置的值一直赋值不上去,之前也是这样操作的,按道理没有问题。今天有时间就看了下源码。二.分析 首先交代一下代码场景:一个类(A)里面设置了三个字段 KFC,MyTest,age(这三个字段都是我随便取的),其中,KFC,age两个字段都已经获取到了值,而MyTest这个字段没有值。 怎么办?只能一步一步的追代码了。重点:看到类里面的字段名变成了myT...原创 2018-06-27 21:37:04 · 666 阅读 · 3 评论 -
JAVA 中BIO,NIO,AIO的理解
在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解。具体如下: 序号问题1什么是同步?2什么是异步?3什么是阻塞?4什么是非阻塞?5什么是同步阻塞?6什么是同步非阻塞?7什么是异步阻塞?8什么是异步非阻塞?在弄清楚上面的几个问题之前,我们首先得明白什么是同步,异步,阻塞,非阻塞,只有这几个单个概念理解清楚了,然后在组合理解起来,就相对比较容易了。 1,同步和异步是针对应用程序和内核的...转载 2018-04-23 00:24:21 · 256 阅读 · 1 评论 -
什么是java中的CAS
问题一:java中的CAS是什么?问题二:为什么要使用CAS?问题三:CAS使用中需要注意什么问题? 这里以提问的方式引出话题,下面带大家慢慢了解CAS。1.CAS的含义CAS是compare and swap的缩写,即我们所说的比较交。cas是一种基于锁的操作,而且是乐观锁。在java中锁分为乐观锁和悲观锁。悲观锁是将资源锁住,等一个之前获得锁的线程释放锁之后,下一个线程才可以访问。而乐观...原创 2018-04-13 02:39:42 · 43512 阅读 · 10 评论 -
源码解读--LinkedList
一.序言在上一篇队列中,只讲解了基本原理,今天就来聊聊队列的一个实现,也是面试中经常和ArrayList对比的一个类--LinkedList。java源码系列。他们的不同点:1.实现结构不同。ArrayList 是基于数组的list。LinkedList是基于链表的list。2.初始容量不同。ArrayList初始容量是10,之后按1.5倍扩容。LinkedList没有初始容量一说。3.访问方式。...原创 2018-04-05 23:32:28 · 268 阅读 · 0 评论 -
源码解读--线程池TheadPoolExecutor深入讲解
在使用线程的,我们常使用线程池,线程的复用可以减少线程的开销,很好的提高cpu资源利用率。这篇文章信息量会很大,做好准备哦~ java源码系列。 有对线程池没有直观感觉的同学可以看看这篇文章。在jdk8中,从ThreadPoolExecutor从发,来逐步讲解它的源码实现。1.线程池定义初始值private final AtomicInteger ctl = new AtomicI...原创 2018-04-18 01:01:32 · 2537 阅读 · 0 评论 -
源码解读--Queue
上一篇讲了栈,这一篇来简单讲讲队列,这java中,队列比栈啰嗦一点,queue被设计成了一个接口,它分为阻塞式和非阻塞式。阻塞队列与非阻塞队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列插入新的元素。同样,试图往已满的阻塞队列中添加新元素的线程同样也会被阻塞,直...原创 2018-04-04 23:23:47 · 248 阅读 · 0 评论 -
java中的字符retry: 是什么?
在看源码时,出现了retry: ,这个是什么意思?之前没有接触过,那先来一个简单的例子。 public void testRetry() { int i = 0; retry: //① while (true) { i++; System.out.println("i=" + i); ...原创 2018-04-17 16:16:53 · 4609 阅读 · 5 评论 -
初步诊断你的GC
前言JVM的GC机制让Java程序员省去了自己垃圾回收的烦恼,大大提高了生产效率。但是正因为JVM垃圾回收机制足够优秀,导致很多Java程序员对JVM这个黑盒了解甚少,很多人没有去了解它,很多人也没机会去了解它。然而要想成为一名优秀的Java程序员,了解JVM和它的GC机制,写出JVM GC机制更喜欢的代码,是必须要掌握的一门技术;这篇文章我主要说一下如何初步诊断JVM的GC是否允许正常,重点讲解...转载 2018-03-29 11:45:58 · 1475 阅读 · 0 评论 -
源码解读--Stack
今天来说说java里面的栈。栈是一种先进后出或者后进先出的一种数据结构。先来看下图谱。java源码系列。Stack继承了vector,大家都知道vector是线程安全的。为什么是线程安全的呢?因为方法前面用了synchronized修饰。为什么用了synchronized就是线程安全的呢?因为synchronized内部有锁的概念,线程在没有获取的资源的时候放入entry set,获取到了资源就是...原创 2018-04-04 13:08:07 · 458 阅读 · 0 评论 -
源码解读--ArrayList
对于开发人员来说,用的最多的就是数组,链表,Map和List,之前我写过一篇HashMap的源码解读,今天就来简单说说ArrayList的源码。java源码系列。一.首先看看她的初始化方法:第①种public ArrayList() { //无参的构造器,初始值是一个默认的空 DEFAULTCAPACITY_EMPTY_ELEMENTDATA ={} this.elementData ...原创 2018-04-03 21:04:45 · 545 阅读 · 0 评论 -
java 线程池深入介绍
一简介线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的。在jdk1.5之后这一情况有了很大的改观。Jdk1.5之后加入了java.util.concurrent包,这个包中主要介绍java中线程以及线程池的使用。为我们在开发中处理线程的问题提供了非常大的帮助。二:线程池线程池的作用:线程池作用就是限制系统中执行线程的数量。 根据系...转载 2018-04-16 14:44:18 · 535 阅读 · 0 评论 -
源码解读--LinkedBlockingDeque讲解
在上一遍线程池的讲解中,如果线程的大小大于核心线程的大小,就会放到缓冲队列里面,这个队列就是LinkedBlockingDeque。下面就来深入讲解一下这个队列。java源码系列。一.LinkedBlockingDequ的定义首先看下图谱它是一个队列,而且还是阻塞式的,还可以告诉你,它是线程安全的。LinkedBlockingDeque用的是一个双向的链表,Node的声明如下:static ...原创 2018-04-19 12:50:26 · 806 阅读 · 0 评论 -
教你代码实现抢红包功能
一.场景带入抢红包在现实场景中经常见到,你知道如何通过代码来实现吗?一种通常的思路是,一定金额的红包,只要有人过来抢,就在剩余数额内给他分配金额,直到所有钱都分陪完。但是这样有一个问题,最先抢的人,抢到钱多的概率会更大。比如有10块钱,有甲乙丙三个人按顺序抢,甲开始抢,这时他抢红包的数额范围是0到10,平均是5云,假设甲抢了4元。乙开始抢,这时他抢红包的数额范围是0到6元,平均是3元,假设乙抢了4...原创 2018-04-23 22:25:52 · 15055 阅读 · 25 评论 -
高并发下ArrayList空值(null)问题
对于ArrayList,有一篇blog专门的介绍,它不适用于多线程环境中,废话不多说,直接上代码让大家看个明白!public class ArrayListTest { @Test public void test() { List<Person> personList = new ArrayList<>(); for (in...原创 2018-06-20 12:30:49 · 8936 阅读 · 4 评论 -
future的简单实现
一 .入门相信大家使用过线程,对future应该不会陌生吧! 在java一种最简单的使用是Callable,比如:public class A implements Callable<String> { @Override public String call() throws Exception { return "aaa"; }}@org....原创 2018-06-21 14:54:42 · 1116 阅读 · 1 评论 -
java排序--堆排序
一.简介 上一篇讲了快速排序,这一篇来讲讲堆排序。堆可以借助借助完全二叉树来理解,数值排列按照广度优先算法输出的顺序给出。堆排序分按大堆排序和小堆排序。堆排序就是一趟排序完,最大的值在最前面;而按小堆排序就是一趟排序完,最小的值在最前面。 排序过程为使记录序列按关键字非递减有序排序,则在堆排序的算法中,先建一个“大顶堆”,即先选得一个关键字为最大的记录并与序列中最后一个记录...原创 2018-04-29 21:48:48 · 577 阅读 · 1 评论 -
《effective java》builder模式一些思考
在java中,对于类中属性赋值,大部分情况下会使用set,get,可能还有些boolean的属性有些框架会用is做为前缀。但是对于一个类中有多个参数,总不能set多个参数或者构造函数中写多个参数的构造吧。在idea中生成构造函数和set/get方法都是有快捷方式的,但是在使用的时候就痛苦了。对于这个问题,有没有什么好的解决方法呢?《effective java》中推荐使用bulder模...原创 2018-05-05 22:45:41 · 819 阅读 · 1 评论 -
Leaf——美团点评分布式ID生成系统
背景在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识。如在美团点评的金融、支付、餐饮、酒店、猫眼电影等产品的系统中,数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息,数据库的自增ID显然不能满足需求;特别一点的如订单、骑手、优惠券也都需要有唯一ID做标识。此时一个能够生成全局唯一ID的系统是非常必要的。概括下来,那业务系统对ID号的要求有哪些呢?全局唯一性:不能出现重...转载 2018-02-25 10:23:28 · 4057 阅读 · 0 评论 -
调用线程的yield()方法会不会只让优先级相同的执行?
在一些blog上面,对于线程的yield(),他们对调用这个方法的的描述为,只会将运行权让给相同优先级或更高的优先级执行。这样就很容易使读者以为,如果有两个线程a和b,a的优先级大于b的优先级,即使a调用了yeild()方法,由于b的优先权低于a,那么线程需要等a运行完之后b才有机会运行,是这样的?public class YieldTest extends Thread { ...原创 2018-04-26 00:10:36 · 5180 阅读 · 6 评论 -
java源码系列
之前都是一篇一篇文章写的,发布时间不一,比较散乱,特整理如下:详细解析jdk7HashMap源码源码解读--ArrayList源码解读--Stack源码解读--Queue源码解读--LinkedList源码解读--HashSet 源码解读--HashMap(jdk8)源码解读--线程池TheadPoolExecutor深入讲解源码解读--LinkedBlockingDeque讲解源码解读--...原创 2018-04-21 20:05:54 · 1182 阅读 · 1 评论 -
源码解读--AbstractQueuedSynchronizer讲解之Reentrantlock实现
一.锁 说起AbstractQueuedSynchronizer(传说中的AQS),可能有些同学不知道,但是说到ReentrantLock,CountDownLatch,Seamphore,大家可能用用过吧。他们都是用锁来实现了,而锁里面又分独占锁和分享锁。具体锁的种类请看文章。ReentrantLock是独占锁,而CountDownLatch,Seamphore是分享锁。锁里面还有一个重要的分...原创 2018-04-21 17:53:24 · 272 阅读 · 1 评论 -
JAVA锁有哪些种类,以及区别
在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类。介绍的内容如下:公平锁/非公平锁可重入锁独享锁/共享锁互斥锁/读写锁乐观锁/悲观锁分段锁偏向锁/轻量级锁/重量级锁自旋锁上面是很多锁的名词,这些分类并不是全是指锁的状态,有的指锁的特性,有的指锁的设计,下面总结的内容是对每个锁的名词进行一定的解释。公平锁/非公平锁公平锁是指多个线程按照申请锁的顺序来获取锁。非公平锁...转载 2018-04-21 14:42:18 · 565 阅读 · 1 评论 -
记一次生产问题--CompletableFuture默认线程池
在jdk7中,我们使用线程池可能会使用ExecutorService,默认有四种方式Executors.newSingleeThreadPool()Executors.newFixedThreadPool()Executors.newCacheThreadPool()Executors.newScheduledThreadPool()在jdk8中,CompletableF...原创 2018-04-20 02:18:53 · 28568 阅读 · 19 评论 -
深入讲解volatile关键字
volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。 volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解...转载 2018-04-16 12:11:43 · 176 阅读 · 0 评论 -
源码解读--HashMap(jdk8)
一.基础知识之前写过一篇jdk7版的HashMap,今天在此基础上面讲讲jdk8中的HashMap。先来看看他们的不同。java源码系列。1.jdk7中,扩容插入使用的是前插法,jdk8中使用的是尾插法。2.jdk7中使用的是数组+链表的数据结构,查找时间复杂度取决于链表的长度为 O(n)。jdk8中使用的是数组+链表+红黑树(链表的个数大于8的时候,扩展为红黑树)的数据结构,将查找的...原创 2018-04-10 20:19:27 · 450 阅读 · 0 评论 -
jdk8 sorted 排序值comparing 和thenComparing 偶遇问题解析
在java8之前,排序有两种方法:1.定义比较器类 继承Comparator接口,然后重写compare(a,b) 方法,返回的结果是int类型 0 代表 a==b1 代表 a>b-1 代表 a<b2.定义比较器对象Comparator<Person> c1 = new Comparator<Person>() { @Override ...原创 2018-03-02 14:32:50 · 38926 阅读 · 3 评论 -
jsatck pid 中 各种情况解释
1,线程状态为“waiting for monitor entry”:意味着它 在等待进入一个临界区 ,所以它在”Entry Set“队列中等待。此时线程状态一般都是 Blocked:java.lang.Thread.State: BLOCKED (on object monitor) 2,线程状态为“waiting on condition”:说明它在等待另一个条件的发生,来把自己唤醒,或者干...转载 2018-03-01 21:42:16 · 625 阅读 · 0 评论 -
Class.forName()和ClassLoader.loadClass()区别
Class.forName()和ClassLoader.loadClass()区别?Class.forName():将类的.class文件加载到jvm中,并且对类进行解释,执行类中的static块;ClassLoader.loadClass():只会将.class文件加载到jvm中,不会执行static中的内容,但是在newInstance会去执行static块。public void test1...原创 2018-03-01 13:13:43 · 360 阅读 · 0 评论 -
Google Guava 美化 Java 代码
文章转载自:http://my.oschina.net/leejun2005/blog/172328目录:[ - ]1-使用 GOOGLE COLLECTIONS,GUAVA,STATIC IMPORTS 编写漂亮代码1、Google Collections一览2、操作lists和maps3、静态导入和Eclipse模板4、Guava走马观花2-深入探索 GOOGLE GUAVA 库1、The G...转载 2018-03-15 13:27:21 · 204 阅读 · 0 评论 -
栈,堆,方法区之间的引用关系
序言在jvm的内存模型中主要包括包括 虚拟机栈,堆,方法区,pc计数器,native栈。1.栈 这里说的栈是java栈,请和本地方法栈区分开。栈是一种先入后出的数据结构,java在java.util 包下就有实现了的stack,她在jdk1.0就有了。集成自vector,是线程安全的。好了,我们来说说jvm里面的栈,栈由一个个栈帧组成,栈帧里面又包括操作数栈,局部变量表,方法出口,动态连接等。操...原创 2018-02-28 19:21:57 · 2617 阅读 · 0 评论 -
深入讲解jstack命令
jstack是java虚拟机自带的一种堆栈跟踪工具。功能jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待...转载 2018-02-28 10:34:12 · 879 阅读 · 0 评论 -
cms常见报错以及解决办法
在使用cms垃圾收集器时可能会看到: 一 并发模式失败(concurrent mode failure)产生这种报错的原因有两个1.年轻代提升太快,老年代的处理速度跟不上新生代的提升速度解决办法:①.调大新生代空间 -Xmn ②.加大新生代晋升的阈值 -XX:MaxTenuringThreshold 2.老年代碎片过多解决办法:①.调到老年代的比例 –XX:NewRatio 调大 ②.设置...原创 2018-02-27 10:40:03 · 7666 阅读 · 0 评论 -
通俗易懂的数独算法(java)
数独算法一 绪言 偶尔玩下休闲益智小游戏,一方面可以舒解下心情,另一方面刺激下大脑皮层。百度了一下数独 的起源和概念。说了那么多,看着就累。精简一下就是数字(0-9)填充游戏。不明白的来一张大图。看到了吧,就这样子滴~,先有个直观印象吧。二 规则 往简单点说就3条: 1.每个横列需要1~9数值填充,不能重复。 2.每个纵列需要1~9数值填充,不能重...原创 2018-02-26 10:02:56 · 2419 阅读 · 0 评论 -
jvm 常用命令
trace 跟踪参数 -verbose:gc -XX:+PrintGC 打印gc-XX:+PrintGCDetails 打印gc的详细信息Heap PSYoungGen total 76288K, used 5243K [0x000000076b380000, 0x0000000770880000, 0x00000007c0000000) e原创 2017-08-20 17:34:01 · 248 阅读 · 0 评论 -
如果一个箱子里面有100个球,有两个玩家,1和2,他们都很聪明,可以随机从箱子里面拿出2或6个球,箱子是透明的并且箱子里面有多少个球他们也可以看得到 ,如果算最后一个球能被谁拿到,谁就是
最近得到了一个很有趣的题目,之前没有考虑清楚,现在有空就拿Java溜了一把。 * 题目: * 如果一个箱子里面有100个球,有两个玩家,1和2,他们都很聪明, * 可以随机从箱子里面拿出2或6个球,箱子是透明的并且箱子里面有多少个球他们也可以看得到, * 如果算最后一个球能被谁拿到,谁就是赢家。 * 问: * 1 谁先拿谁赢 * 2 谁后拿谁赢 * 3 谁先拿谁后拿没有什么必然关系如果这个问题问到...原创 2017-03-15 21:29:36 · 1830 阅读 · 0 评论 -
深入理解java 的深拷贝和浅拷贝
一 深拷贝和钱拷贝的概念1.深拷贝将所有的引用对象拷贝。例如a引用b,b引用c,在拷贝得到a’时,a’里面的引用对象是b',b'里面的引用对象是c’.直接输入a和a’,看到他们是不同的引用地址。2.浅拷贝只拷贝对象,不拷贝引用。例如a引用b,b引用c,在拷贝得到a’时,a’里面的引用对象和a里面的是一样大的,同理下一层的引用也是一样。二 深浅拷贝实现的方式说到拷贝,就不能不说一下new 和clon...原创 2018-02-25 11:35:36 · 397 阅读 · 0 评论 -
java 异常
原创 2018-02-25 13:49:57 · 131 阅读 · 0 评论 -
Java NIO?看这一篇就够了!
现在使用NIO的场景越来越多,很多网上的技术框架或多或少的使用NIO技术,譬如Tomcat,Jetty。学习和掌握NIO技术已经不是一个JAVA攻城狮的加分技能,而是一个必备技能。在前面2篇文章《什么是Zero-Copy?》和《NIO相关基础篇》中我们学习了NIO的相关理论知识,而在本篇中我们一起来学习一下Java NIO的实战知识。全文较长,建议先马后看(记得关注不迷路)。一、概述...转载 2018-04-10 10:03:28 · 121699 阅读 · 28 评论 -
我反编译了Java 10的本地变量类型推断
Java 10 推出之后,很多文章也随之出来了,告诉我们有哪些特性,告诉我们本地变量类型推断怎么用。但是,知其然,要知其所以然。Java 10发布之后,我第一时间下载了这个版本的Jdk并安装到我的电脑中,然后写了一段代码,并尝试着进行了反编译,真正的感受一下本地变量推断到底如何。这篇文章简单来谈一下我的感受。原理关于本地变量类型推断的用法,我的《Java 10将于本月发布,它会改变你写代码的方式》...转载 2018-03-22 09:02:27 · 339 阅读 · 0 评论 -
Spring AOP 的实现机制
AOP(Aspect Orient Programming),一般称为面向切面编程,作为面向对象的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理、日志、缓存等等。AOP实现的关键在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理和动态代理,静态代理的代表为AspectJ;而动态代理则以Spring AOP为代表。静态代理是编译期实现,动态代理是运行期实现,可想而知前者...转载 2018-03-21 23:02:53 · 139 阅读 · 0 评论