java
文章平均质量分 96
fan2012huan
这个作者很懒,什么都没留下…
展开
-
Java多线程 之 Callable sleep yield 优先级(三)
1.Callable通过Runnable接口定义的任务其run方法没有返回值。要想获得返回值,需要通过Callable接口来定义任务,其call方法可以有返回值。而且,Callable任务只能通过 ExecutorService.submit方法来调用。submit方法会返回Future类型的对象,可以通过isDone方法来检查任务是否完成,通过get方法来获取任务的返回值。当然也可以不调用isDo原创 2016-06-02 21:44:04 · 2138 阅读 · 0 评论 -
HashMap源码注解 之 静态工具方法hash()、tableSizeFor()(四)
注意 , 本文基于JDK 1.8 HashMap#hash()为什么要有HashMap的hash()方法,难道不能直接使用KV中K原有的hash值吗?在HashMap的put、get操作时为什么不能直接使用K中原有的hash值。 /** * Computes key.hashCode() and spreads (XORs) higher bits of ha...原创 2016-04-08 15:53:25 · 21255 阅读 · 18 评论 -
HashMap源码注解 之 内部数据结构 Node (三)
注意 , 本文基于JDK 1.8 1.Node /** * Basic hash bin node, used for most entries. (See below for * TreeNode subclass, and in LinkedHashMap for its Entry subclass.) */ static class Node<K原创 2016-04-08 15:46:32 · 5982 阅读 · 0 评论 -
java方法调用之重载、重写的调用原理(一)
前一段时间看了《深入理解JVM》第三部分虚拟机执行子系统的内容,看到了重载与重写在JVM层面的调用原理(详见8.3 方法调用一节),但是没有写成博客总结一下,这里讨论讨论。在讨论过程中,难免会涉及到 字节码指令 相关的内容,这部分内容请查看博文: 由常量池 运行时常量池 String intern方法想到的(二)之class文件及字节码指令 。结论1.重载(overload)方法 对重载方法原创 2016-03-29 11:34:39 · 13688 阅读 · 2 评论 -
关于快速报错fail-fast想说的之fail-fast的实现原理(一)
最近在翻译HashMap的源码注释,看到了fail-fast。之前在看第四版《Thinking in java》的第17章容器深入研究 17.11.3中的“快速报错”时就有些迷迷糊糊,今天查了下资料,总结总结。注意,本文的讨论都是基于JDK 1.8的。 结论快速报错,是指当有其他线程对一个容器(如ArrayList,HashMap)进行了结构性修改,另外一个线程在使用iterator进行迭代,那么原创 2016-04-07 10:34:10 · 4086 阅读 · 1 评论 -
Java多线程 之 生产者、消费者(十三)
1.为什么要使用while循环来包围wait调用? 如果有多个waiter在竞争一个厨师的“菜”,一个waiter抢到“菜”之后,其他人就不能再抢到菜。当另一个再去判断while条件时,可能已经被那个抢到的waiter将条件置为满足了,这时不得不又wait。但是,如果这时那个抢到的waiter没有执行到更改条件怎么办呢?从这个示例代码上好像无法解释,等以后看到合适的代码再来阐述。 2.一定要在“原创 2016-07-13 21:59:03 · 882 阅读 · 0 评论 -
HashMap源码注解 之 put()方法(六)
注意 , 本文基于JDK 1.8 HashMap#put() /** * Associates the specified value with the specified key in this map. * If the map previously contained a mapping for the key, the old * value is r原创 2016-04-24 14:14:04 · 4994 阅读 · 0 评论 -
log4j的简单介绍
这里有一篇介绍log4j较为详细的博文,粗略看了下,下次再深入看看,写一个较为深入的介绍,先把连接记录在这里: log4j详细介绍 关于log4j的日志一直弄的不清不楚。这里总结总结:1. Demo示例在工程中经常看到类似这样的代码:private static final Log logger = LogFactory.getLog(XxxxClass.class);private stat原创 2016-06-19 13:51:46 · 17953 阅读 · 0 评论 -
Java多线程 之 原子性与可见性(八)
1.原子性java中的原子性,是指:原子操作是不能被线程调度机制中断的;操作一旦开始,它一定会在可能发生的“上下文切换”(即切换到其他线程执行)之前执行完毕。 但是千万不要认为“原子操作不需要同步控制(这是错误的)”! 原子性可以应用于除long和double之外的基本类型的简单操作(赋值和返回值)。long和double这种64位的数据类型,在JVM内部是通过两条32位的操作完成的,因此有可能原创 2016-06-19 19:00:01 · 2871 阅读 · 0 评论 -
Java多线程 之 wait、notifyAll(十二)
1.wait简答介绍前面的介绍都是关于线程同步的,也就是说,多个线程不能同时访问共享资源,但是后面的几篇博文将介绍线程之间的协作。 注意:sleep、yield调用并没有释放锁。 在多线程协作中,最经典的问题就是生产者-消费者问题了。只有生产者生产出了产品消费者才能去消费。因此,在生产者生产出产品之前消费者需要等待阻塞,当生产者生产者生产出产品之后可以通知消费者去消费。 wait方法会等待外部原创 2016-07-04 22:41:20 · 742 阅读 · 0 评论 -
关于set想说的(一)之Set的实现类及必要的方法
最近看到了《Thinking in Java》的第17章 容器深入探究,17.6 Set和存储顺序。自己写了写测试代码,加深下理解。主要设计toString()方法(主要是为了方便打印),equals()方法,hashCode()方法,compareTo()方法。结论首先明确Set接口有三种不同的实现,HashSet()、TreeSet()、LinkedHashSet()。 HashSet() :原创 2016-03-23 10:46:54 · 3901 阅读 · 1 评论 -
子list中的顺序会影响list的顺序问题
最近在看《Thinking in Java》中关于容器的章节(第11章 持有对象),有一个例子发现subList中数据顺序的改变会影响原list中数据的顺序。下面总结如下。结论使用List.subList方法得到的子序列其实只是将指针指向了原list,并设置了这个sub list的大小。使用Arrays.asList(数组的引用)这种方式生成链表时,该链表仍然指向这个数据,因此,对这个链表中数据原创 2016-03-21 14:39:29 · 3697 阅读 · 1 评论 -
Java多线程 之 后台线程(四)
java可以设置一个线程是否是后台线程。后台线程通常作为一种服务线程而存在,并不是程序不可或缺的一部分。当所有的非后台线程退出时,整个程序也就退出了,而且会关闭进程中的所有后台线程。所以,如果在后台线程中有finally语句,则不一定会执行。看下面的例子:package org.fan.learn.thread.deamon;import java.util.concurrent.Executor原创 2016-06-07 17:23:15 · 527 阅读 · 0 评论 -
UML边看边记 之 类与类之间的关系(三)
上一篇介绍了下类与类之间的关联关系。关联关系的种类比较多,所以单独写了一篇。这篇文章主要介绍:依赖关系、泛化关系、接口与实现类关系。1.依赖关系依赖关系值一个类的实现依赖另一个类。如,Driver类的drive方法依赖于Car类中的move()方法。 注意依赖关系与关联关系的区别:关联关系中一个类作为另一个类的属性存在,而依赖关系的属性中不存在另一个类。 依赖关系的UML图用带箭头的虚线表示。原创 2016-05-26 22:41:04 · 788 阅读 · 0 评论 -
Java多线程 之 Thread子类 join方法(五)
1.thread前面都是使用Runnable接口定义任务,还可以使用Thread方式来定义。 最好不要在构造方法中启动线程。因为,另一个任务有可能在构造器结束之前开始执行,这意味着该任务能够访问处于不稳定状态的对象。因此,优选Executor而不是显示的创建Thread对象。package org.fan.learn.thread.ThreadTest;/** * Created by fan原创 2016-06-10 16:05:38 · 939 阅读 · 0 评论 -
Java多线程 之 访问共享资源synchronized、lock(七)
上一篇博文引出了资源竞争,并使用例子展示了资源竞争产生的结果(错误)。这篇博文给出解决方法。1. synchronized解决线程冲突的方案基本上都是:序列化访问共享资源。即当多个线程对共享资源同时访问时,对共享资源加锁访问。在Java中提供了synchronized关键字。 在java中,所有对象都自动含有单一的锁。也就是说,当一个任务调用某个对象上被synchronized标识的f()方法时,原创 2016-06-12 16:07:03 · 3535 阅读 · 0 评论 -
Java多线程 之 访问共享资源(六)
多线程产生问题的原因大多都是访问了共享资源。所谓共享资源就是只能被一个线程访问的内存对象(如变量、打印机、文件、输入输出端口等)。下面看一个《Thinking in java》第四版中给出的一个例子:package org.fan.learn.thread.share;import java.util.concurrent.ExecutorService;import java.util.con原创 2016-06-12 14:40:51 · 1235 阅读 · 0 评论 -
Java多线程 之 ThreadPoolExecutor(九)
最近在工作中遇到了ThreadPoolExecutor的使用,而且是由于它的配置不当导致了线上问题。下面对其进行简单介绍。 先看看ThreadPoolExecutor常用的构造方法: public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,原创 2016-06-28 12:20:11 · 1019 阅读 · 0 评论 -
Java多线程 之 临界区、ThreadLocal(十)
1.临界区临界区就是在同一时刻只能有一个任务访问的代码区。在java中通常使用下面的方式来实现:synchronized(syncObject) { //critical section}当然也可以使用Lock对象来实现临界区。 要访问临界区就要先获得syncObject这个对象的锁。注意,每个java对象都隐含有一把锁。 使用临界区的执行效率要比使用synchronized方法的执原创 2016-06-29 11:04:31 · 10947 阅读 · 0 评论 -
小米push
最近在看小米push的SDK,今天总结总结。小米为什么要开发push这个要从苹果iPhone的push谈起。1.IOS的push原理我们知道iPhone的APP从前台退到后台进程就处于挂起状态了,不在运行了,流量也不在消耗了。那么,如果诸如微信、QQ、微博等有消息传来,那岂不是APP要损失很多用户,而且用户无法收到实时的消息,那谁还用iPhone啊。so,Apple想到了一种方式:iPhone的IO原创 2016-01-11 17:55:36 · 8503 阅读 · 0 评论 -
Java多线程 之 终结任务(十一)
ExecutorService.awaitTermination()等待每个任务结束,如果所有的任务在超时时间到达之前都结束了,则返回true,如果没有全部结束则返回false。这会导致每个任务都退出其run方法,并因此作为任务而终止。 这里要讨论的主题是:如果一个任务处于阻塞状态如何终止它?也就是说在run方法的中间如何终止它?中断被阻塞的任务可能需要清理资源。为了能够在run方法的中间终止任务原创 2016-06-29 16:47:29 · 1667 阅读 · 0 评论 -
Java多线程 之 lock与condition的使用(十四)
在博文 Java多线程 之 wait、notifyAll(十二) 中使用wait、notify使“打蜡”和“抛光”两个任务能够协同工作,本文阐述使用lock、condition来实现。而且使用signalAll要比使用notifyAll更安全。1.使用抛出异常package org.fan.learn.thread.testCondition;import java.util.concurrent原创 2016-07-17 12:25:25 · 983 阅读 · 0 评论 -
Java多线程 之 同步队列BlockingQueue与管道(十五)
一.同步队列BlockingQueue前面的两篇博文: Java多线程 之 生产者、消费者(十三) Java多线程 之 lock与condition的使用(十四) 详细阐述了多个任务之间的协同合作,需要使用wait、notify、notifyAll或者lock、condition、await、signal、signalAll方法来进行同步。实现起来比较复杂。因此java提供了同步队列原创 2016-07-17 15:41:22 · 4833 阅读 · 0 评论 -
Json工具Demo(二)
上篇文章Json工具Demo(一) 说了一些Json和Jackson框架的基本知识,以及Demo中需要用到的基本类。这篇文章主要写下json和java对象之间相互转换的工具类JacksonUtil.java和测试类Main.java。JacksonUtilJacksonUtil.javapackage org.fan.learn.utils;import com.fasterxml.jackson.原创 2016-03-01 12:07:33 · 1625 阅读 · 0 评论 -
关于单例、关于DCL:Double Check Lock、关于volatile
Java程序员面试都会被问到单例模式,有的公司(如1.)还会问单例模式的各种实现。结论(1)单例的实现请直接看第4和第5。 (2)volatile总共实现了两个功能: a.多线程间的可见性问题 b.对象实例化时的完整性问题 下面阐述下具体写法。1.public class Singleton { private Singleton() {原创 2016-12-04 17:54:15 · 3333 阅读 · 4 评论 -
PropertiesManager java
PropertiesManager pm = new PropertiesManager(confFile);原创 2017-03-22 16:15:46 · 839 阅读 · 0 评论 -
Jedis详解
http://www.jianshu.com/p/7913f9984765pipiline的实现方式 http://www.jianshu.com/p/5e12556a0aa9原创 2017-03-22 16:16:55 · 1029 阅读 · 0 评论 -
new
CMS promotion failed concurrent mode failureCAP原创 2017-04-18 15:30:47 · 665 阅读 · 0 评论 -
FCGI协议的header解析
FCGI协议的heade比较简单只有8个字节,其C语言定义格式如下:typedef struct { unsigned char version; //版本 unsigned char type; //操作类型 unsigned char requestIdB1; //请求id unsign原创 2017-04-15 12:41:03 · 2544 阅读 · 0 评论 -
fcgi4j与PHP-FPM通信遇到的问题
一.前言前一篇文章介绍了一些CGI、FCGI相关的概念,详见 理解CGI、FCGI、php-cgi、php-fpm的概念 。从这篇文章知道PHP-FPM是PHP实现FCGI协议的一个组件,负责FCGI协议编码的请求的解析和转发。 fcgi4j是一个Java解析fcgi协议的组件,其git地址为:fcgi4j github。二.问题在工作中遇到的问题: 在线上,当PHP-FPM对数据包进行分包,f原创 2017-03-25 16:03:09 · 797 阅读 · 0 评论 -
NIO Buffer To String
byteBufferToStringpublic static String byteBufferToString(ByteBuffer byteBuffer) { String result = ""; try { int length = byteBuffer.remaining(); byte[] bytes =原创 2017-04-15 16:45:14 · 717 阅读 · 0 评论 -
MyCodePool
NIO Buffershell原创 2017-04-15 16:42:18 · 657 阅读 · 0 评论 -
google allocation instrument
连接: https://github.com/google/allocation-instrumenter quick start: https://github.com/google/allocation-instrumenter/wikipom依赖<dependency> <groupId>com.google.code.java-allocation-instru原创 2016-12-12 19:01:59 · 747 阅读 · 0 评论 -
抽象类与抽象方法的使用
学了这么长时间的抽象类与抽象方法,只是看别人这么设计,这么写。现在终于在项目中实际使用了。下面抽象出来,阐述下。 在现有的系统下,已经有了下面的实现:package org.fan.animal;/** * Created by fan on 2016/11/28. */public interface Animal { void doEat();}假设这个食草动物,每次eat之前原创 2016-11-28 20:45:48 · 834 阅读 · 0 评论 -
由常量池 运行时常量池 String intern方法想到的(二)之class文件及字节码指令
上一篇博文由常量池 运行时常量池 String intern方法想到的(一)引入了问题,看到了java源代码对应的字节码,本文对java字节码及java指令进行一些说明,并逐句分析上一篇博文的字节码指令,分析栈深度。java字节码结构上篇文章中看到了java源代码对应的字节码指令,下面看看Test.class文件的真实内容。查看二进制的工具可以使用notepad++查看,但是需要一个HexEdi原创 2016-03-16 17:25:33 · 2349 阅读 · 0 评论 -
Java多线程 之 Runnable Thread (一)
最近看的东西有些乱。励志从XOA2看起、学起,发现需要看下thrift,看着看着thrift,发现需要学学NIO,学完了NIO温习温习前面看的thrift,却要休假10天。休假回来,感觉要学学多线程。多线程这厮,看《Thinking in java》第21章的前几个小节,这是第3次了。这次要坚持下来,并且记录下来。——勉之! 程序做的事情可以抽象成一个一个“任务”,任务是由线程来驱动的,线程是一个原创 2016-06-01 09:43:33 · 743 阅读 · 0 评论 -
关于快速报错fail-fast想说的之fail-fast的避免方法(二)
上篇博文关于快速报错fail-fast想说的之fail-fast的实现原理(一) 讨论了fail-fast的基本知识及实现原理,了解了ArrayList的fail-fast在多线程工作下的缺陷,这篇博文说下解决办法,主要是讨论CopyOnWriteArrayList的用法。 注意,本文讨论的内容基于JDK 1.8 示例代码(一)1. 代码 public static void main(原创 2016-04-07 13:03:53 · 3172 阅读 · 0 评论 -
子list中的顺序会影响list的顺序问题(二)
之前写的这篇文章 子list中的顺序会影响list的顺序问题 ,时隔两个多月的今天再去看发现有很多问题都没有阐述清楚,今天对其做一个补充说明。 存在的问题: (1)没有从JDK源码层面说明问题 (2)Arrays.asList(T… args)是一个变长参数方法,为什么传递数组会影响顺序,而传递多个离散的参数却会影响顺序呢?详见上一篇博文中 子list中的顺序会影响list的顺序问题 示例代原创 2016-05-24 22:17:10 · 2511 阅读 · 0 评论 -
NIO边看边记 之 Buffer(三)
缓冲区Buffer其实就是一块内存区域。用于和channel来进行数据交互。从channel中读取数据到buffer,将buffer中的数据写到channel中。这块内存区域在java NIO中被封装成Buffer对象。Buffer的基本用法使用buffer进行读写数据一般会经过如下4个步骤: (1)从channel中读取数据写到buffer中 (2)调用buffer的flip()方法切换buf原创 2016-05-04 21:02:09 · 649 阅读 · 0 评论 -
NIO边看边记 之 selector选择器(六)
Selector(选择器)可同时监听多个通道上感兴趣的事件(如accept事件、read就绪事件、write就绪事件)。使用Selector可以实现一个线程管理多个通道,进而可以管理多个连接。1.为什么要使用Selector如果不使用Selector要监听多个channel上感兴趣的事件,则需要多线程操作,一个线程监听一个通道的事件。这样导致线程上下文切换的开销(内存)、增加了编程的复杂度。2.Se原创 2016-05-04 21:20:41 · 4826 阅读 · 0 评论