Java
文章平均质量分 66
heqianqiann
每一个不曾起舞的日子都是对生命的辜负
展开
-
ForkJoinPool invoke、execute和submit区别
使用ForkJoinPool的时候发现执行任务的方法有:invoke(ForkJoinTask task)execute(ForkJoinTask<?> task)submit(ForkJoinTask task)三种方式,现在总结下区别。首先比较execute和submit的区别,观察源码发现: /** * Arranges for (asynchro...原创 2019-04-09 22:19:30 · 8498 阅读 · 1 评论 -
JAVA JDK7和JDK8中HashMap的实现
JDK7中的HashMapHashMap底层维护着一个数组,数组中的每一项都是一个Entrytransient Entry<K,V>[] table;存入HashMap的键值对key-value以Entry对象的形式都存储在该table数组中static class Entry<K,V> implements Map.Entry<K,V> { final K key;原创 2017-09-18 14:00:47 · 596 阅读 · 0 评论 -
JAVA 缓存一致性协议
当有多个CPU要访问同一个内存空间时,该内存的值会在每个CPU的缓存中有一个拷贝,如何同步这些拷贝呢?1.互联线的概念互连线是处理器于主存以及处理器与处理器之间进行通信的媒介,有两种基本的互联结构:SMP(symmetric multiprocessing 对称多处理)和NUMA(nonuniform memory access 非一致内存访问)SMP系统结构非常普通,因为它们最容易构建,很多小型服转载 2017-09-17 15:05:01 · 1144 阅读 · 0 评论 -
JAVA 对象的表示模型和运行时内存表示
> There’s only one line of footprints here, because I’m carrying you on the worst days.:-) <Hotspot主要是用C++写的,所以它定义的Java对象表示模型也是基于C++实现的。Java对象的表示模型叫做“OOP-Klass”二分模型,包括两部分:1.OOP,即Ordinary Object原创 2017-09-17 14:41:15 · 406 阅读 · 0 评论 -
JAVA synchronized实现原理以及其中锁优化的归纳总结
在java中存在两种锁机制,分别是synchronized和Lock。Lock接口和实现类是JDK5添加的内容,而synchronized在JDK6开始提供了一系列的锁优化,下面总结一下synchronized的实现原理和涉及的一些锁优化机制1.synchronized内部实现原理synchronized关键字在应用层的语义是可以把任何一个非null对象作为锁,当synchronized作用在方法上原创 2017-09-15 16:00:04 · 8069 阅读 · 5 评论 -
JAVA Arrays.sort()和Collectons.sort() 原理分析
今天终于答辩结束,I’M FREEDOM!!! ^—^首先Collections内部也是使用Arrays的sort实现的,因此着重分析Arrays类内的sort是如何实现的主要分两种:对于基本类型,使用调优的快排,双指针快排对于引用类型,采用改进的归并排序 TimSort()注意以下都是JDK8内的实现对于快排的优化是:public static void sort(int[] a) {原创 2017-09-24 10:18:46 · 2427 阅读 · 0 评论 -
JAVA 并发编程学习总结
一 相关概念二 并发级别三 并行的两个定律四 线程和进程线程中断 TODO 待补充join方法守护线程五 内存模型和线程安全原子性有序性可见性Happens-Before五种实现同步通信的机制waitnotify 方法awaitsignal方法BlockingQueue阻塞队列Semaphore 信号量管道通信读写锁问题六 无锁类AtomicIntegerU原创 2017-08-12 21:16:28 · 1048 阅读 · 0 评论 -
JAVA serialVersionUID的作用
作用Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常[InvalidCastException]在某些场合,希望类的不同版本对序列化兼容,因原创 2017-08-09 15:20:32 · 844 阅读 · 0 评论 -
JAVA 线程中的synchronized关键字的使用
synchronized关键字的作用域有二种:是某个对象实例内,synchronized aMethod(){}可以防止多个线程同时访问这个对象的synchronized方法(如果一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法)。这时,不同的对象实例的synchronized方法原创 2017-07-10 10:29:50 · 358 阅读 · 0 评论 -
JDK 1.5-1.8特性
JDK各个版本的特性1.JDK 1.51) 自动装箱和拆箱2) 枚举3) 静态导入4 可变参数Varargs 语法格式是:methodName([argumentList], dataType...argumentName);5) 内省 Introspector6) 泛型 Generic7) For-Each循环2.JDK 1.61) Desktop和SystemTray类原创 2017-07-15 19:58:46 · 430 阅读 · 0 评论 -
JAVA 对象内存布局
Java对象的内存布局:对象头(Header)实例数据(Instance Data)对齐填充(Padding)虚拟机的对象头包括两部分信息 第一部分用于存储对象自身的运行时数据,如hashCode、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等。这部分数据的长度在32位和64的虚拟机(未开启指针压缩)中分别为4B和8B,官方称之为”Mark Word”。 另一部分是原创 2017-07-15 16:44:37 · 357 阅读 · 0 评论 -
JAVA VO、DTO、DO、PO的概念、区别和用处
概念VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。 DTO(Data Transfer Object):数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,我泛指用于展示层与服务层之间的数据传输对象。 DO(D转载 2017-06-13 23:05:59 · 8738 阅读 · 1 评论 -
Effective Java 学习笔记之异常
1) Throwable 所有的异常类的一个共同的祖先2) Error 程序无法处理的错误 表示运行应用程序中比较重要的问题,与代码执行操作无关,表示运行时JVM出现的问题,这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,如Java虚拟机运行错误(Virtual MachineError)、类定义错误(NoClassDefFoundError)等。3) Exception 程序可以原创 2017-06-13 15:09:56 · 596 阅读 · 0 评论 -
JAVA classpath路径问题以及Class.getResource()和ClassLoader.getResource()的区别
Classpath路径问题src不是classpayh,/WEB-INF/classes,lib才是classpath/WEB-INF/classes存放src目录java文件编译后的class文件,xml、properties文件lib和classes同属classpath,访问优先级lib>classesclasspath:和classpath*:的区别 classpath:只会到cl原创 2017-07-13 08:24:02 · 1678 阅读 · 0 评论 -
Effective Java 学习笔记之枚举
1.用enum代替int常量1)为了将数据和枚举常量关联起来 得声明实例域,并编写一个带有数据并将数据保存在域中的构造器。 2)枚举天生就是不可变的,因此所有的域都应该是final的。它们可以是公有的,但是最好做成私有并提供公有的访问方式 3)枚举类型还允许添加任意的方法和域 并实现任意的接口 4)提供了所有Object方法的高级实现 实现了Comparable和Serializable接口,原创 2017-06-12 20:10:49 · 381 阅读 · 0 评论 -
JAVA 并发类(一) 常用的并发类
1. 集合类ConcurrentHashMap:线程安全的HashMap的实现CopyOnWriteArrayList:线程安全且在读操作时无锁的ArrayListCopyOnWriteArraySet:基于CopyOnWriteArrayList 不添加重复元素ArrayBlockingQueue:基于数组 先进先出 线程安全 可实现指定时间的拥塞读写LinkedBlockingQueu原创 2017-09-18 11:27:16 · 2784 阅读 · 0 评论 -
JAVA volatile关键字
内存模型的相关概念大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速度比起来要慢的多,因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行的速度。因此在CPU里原创 2017-09-11 15:34:46 · 252 阅读 · 0 评论 -
JAVA 并发类(四) CopyOnWriteArrayList 源码分析
创建:CopyOnWriteArrayList()添加元素: add(E)获取单个对象:get(int)方法删除对象:remove(E)方法遍历所有对象:iterator()CopyOnWriteArrayList是一个线程安全,读操作无锁的ArrayList创建public CopyOnWriteArrayList()使用方法List<String> list = new CopyOnW原创 2017-09-20 10:28:53 · 427 阅读 · 0 评论 -
Quartz Job类无法注入spring bean问题解决方法
问题描述: 在Quartz的任务类中,无法使用autowired注入spring bean@Component @PersistJobDataAfterExecution @DisallowConcurrentExecution public class XXJob implements Job{ @Autowired private XxxServ...原创 2018-09-06 19:49:04 · 1567 阅读 · 0 评论 -
Metrics 监控工具使用
Metrics是一个Java工具包,里面有各种监控的工具,可以用来监控生产环境中代码的运行状态。通过集成Jetty、Logback、Log4j、Apache HttpClient、Ehcach、JDBI和Jersey等通用库,以及报表平台Ganglia和Graphite提供的监控工具:Gauges:用于某一个值的测量。Counters:计数器是一个AtomicLong的实例,可以增加或...原创 2018-09-05 19:40:09 · 4063 阅读 · 0 评论 -
Java 常用JSON库注意事项
目前常用的json序列化反序列化类库有Jackson、Gson、Fastjson,其中Fastjson利用 ASM 框架,速度是这三者中最快的。本文介绍下这三种 json 库在使用过程中需要注意的地方。fastjson1)字段命名问题例如一个boolean成员变量isOnline,通过IDEA自动生成getter:isOnline(),setter:setOnline(boolea转载 2018-01-30 16:23:51 · 594 阅读 · 0 评论 -
JAVA 死锁,死锁产生的原因,产生死锁的必要条件和解决死锁的方法
死锁:指多个进程因竞争共享资源而造成的一种僵局,若无外力作用,这些进程都将永远不能再 向前推进。安全状态与不安全状态:安全状态指系统能按某种进程顺序来为每个进程分配其所需资源,直至最大需求,使每个进程都可顺利完成。若系统不存在这样一个序列,则称系统处于不安全状态。产生死锁的原因:(1)竞争系统资源 (2)进程的推进顺序不当产生死锁的必要条件:互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时转载 2017-10-14 07:44:23 · 2760 阅读 · 0 评论 -
JAVA BIO NIO和AIO的区别
IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO一.BIO在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信,默认情况下服务端需要对每个请求建立一堆线程等待请求,而客户端发送请求后,先咨询服务端是否有线程相应,如果没有则会一直等待或者遭到拒绝请求,如果有的话,客户转载 2017-10-22 13:10:41 · 1541 阅读 · 0 评论 -
JAVA hashCode()和equals()方法详解
在Object中提供了equals()和hashCode()方法,每一个类都可以重写这两个方法,一般equals()用于判断两个类是否相同,而hashCode()方法用于计算对象的哈希值hashCode方法作用一般在需要使用哈希表的类(Hashtable,HashMap..)中使用,用于寻域Hash是散列的意思,就是把任意长度的输入,通过散列算法变换成固定长度的输出,该输出就是散列值。关于散列值,有原创 2017-10-21 19:47:59 · 1310 阅读 · 0 评论 -
JAVA final关键字
Java中的final关键字可以作用于类、方法以及变量。final作用于变量的时候一般会和static同时使用,变量只读不可修改final作用于方法时该方法不可被子类重写 编译的时候静态绑定因此效率较高final作用于类时该类不可被继承,如String,数值类等就是final的使用final关键字的好处提高了性能。JVM和Java应用都会缓存final变量可以在多线程的环境下进行共享不需原创 2017-10-21 19:14:41 · 1070 阅读 · 0 评论 -
JAVA 创建进程的两种方式
在Java中创建线程有两种方式:继承Thread类或者实现Runnable接口再重写run()方法 那么在Java中要如何创建进程呢?同样也有两种方法通过ProcessBuilder.start()方法先看进程类Processpublic abstract class Process{ abstract public OutputStream getOutputStream(); //原创 2017-09-21 14:54:43 · 10323 阅读 · 2 评论 -
JAVA 多线程(一) ThreadPoolExecutor 原理分析
工作原理当一个新的任务被提交到ThreadPoolExecutor的execute()方法处理,如果当前池中正在运行的线程少于corePoolSize,就会创建一个新的线程来处理任务。 如果线程池中的线程大于等于corePoolSize,但是小于最大容量maximumPoolSize时,队列未满,任务加入到队列中 如果队列满了,正在运行的线程数等于maximumPoolSize,该任务会被拒绝参原创 2017-09-21 14:34:31 · 1438 阅读 · 0 评论 -
JAVA AQS抽象队列同步器详解
之前看到一篇很好的介绍AQS抽象队列同步器的文章,分享下。框架维护了一个state(代表共享资源,注意是volatile修饰的保证可见性)和一个FIFO线程等待队列(多线程争用资源被阻塞时会进入此队列)state的访问方式有三种:getState()setState()compareAndSetState()AQS定义两种资源共享方式:Exclusive(独占,只有一个线程能执行,如Reen转载 2017-09-21 08:47:50 · 1930 阅读 · 0 评论 -
JAVA 并发类(六) ReentrantLock 源码分析
ReentrantLock实现了Lock接口,是一种递归无阻塞的同步机制。首先ReentrantLock有公平锁和非公平锁机制,使用构造方法ReentrantLock(boolean)指定,默认是非公平锁。公平锁的含义是线程按照发出请求的先后顺序获取锁,而非公平锁的机制下,线程可以插队,后到的线程可以直接跳到队列头部获得锁=======================================原创 2017-09-20 17:41:34 · 545 阅读 · 0 评论 -
JAVA 并发类(五) CopyOnWriteArraySet 源码分析
1.创建CopyOnWriteArrayList() 2.添加元素 add(E) 3.删除元素 remove(E) 4.遍历对象iterator();CopyOnWriteArraySet内部使用CopyOnWriteArrayList实现 基本属性: 适合元素不多,读操作较多的并发场合 线程安全 对于add,set,remove这些设计修改的操作比较耗时,因为经常需要复制整个数组原创 2017-09-20 14:46:35 · 396 阅读 · 0 评论 -
JAVA 并发类(三) ConcurrentHashMap 归纳总结
1. JDK6和JDK7中的实现1. 设计思路ConcurrentHashMap采用了分段锁的设计,只有在同一个分段内才存在竞态关系,不同的分段锁之间没有锁竞争。相比于对整个Map加锁的设计,分段锁大大的提高了高并发环境下的处理能力。但同时,由于不是对整个Map加锁,导致一些需要扫描整个Map的方法(如size(), containsValue())需要使用特殊的实现,另外一些方法(如clear()原创 2017-09-18 16:00:54 · 732 阅读 · 0 评论 -
JAVA 并发类(二) ConcurrentHashMap 原理分析
HashTable是一个线程安全的类,使用synchronzied来锁住整张Hash表来实现线程安全,而ConcurrentHashMap允许多个修改操作并发执行,关键在于使用了锁分离技术。使用多个锁来控制对hash表的不同部分进行修改。ConcurrentHashMap内部使用段Segment来表示这些不同的部分,其中每个段都是一个HashTable,它们有自己的锁。只要多个修改操作发生在不同的段原创 2017-09-18 15:05:18 · 493 阅读 · 0 评论 -
JAVA 方法内部类为何只能访问外部final类型变量
所谓“局部内部类”就是在对象的方法成员内部定义的类。而方法中的类,访问同一个方法中的局部变量,却必须要加上一个final。原因是编译程序实现上的困难:内部类对象的生命周期会超过局部变量的生命期。局部变量的生命期:当该方法被调用时,该方法中的局部变量在栈中被创建,当方法调用结束时,退栈,这些局部变量全部死亡。内部类对象生命期,与其它类一样,当创建一个局部内部类对象后,只有当没有其它人再引用它时,它才原创 2017-06-12 13:29:35 · 940 阅读 · 0 评论 -
Effective Java 学习笔记之泛型
1.不要在新代码中使用原生态类型1) 声明中具有一个或者多个类型参数的类或者接口就是泛型类或接口 例如List<E>(读作‘E的列表’) 泛型类和接口统称作泛型2)每个泛型都定义一个原生态类型,即不带任何实际类型参数的泛型名称。例如List<E>相对应的原生态类型是List3)使用原生态类型,如果放入的类型不一致,在编译和运行时不会报错,直到从其中取出元素的时候才会收到提示 List原创 2017-06-10 22:47:45 · 1003 阅读 · 0 评论 -
JAVA 单例Singleton的七种模式
Lazyman 懒汉模式 线程不安全 private static Singleton1 instance; private Singleton1() { } public static Singleton1 getInstance() { if (instance == null) { instance = new Singleto原创 2017-06-09 22:47:43 · 458 阅读 · 0 评论 -
JAVA Map总结
一、Map概述首先先看Map的结构示意图 Map:“键值”对映射的抽象接口。该映射不包括重复的键,一个键对应一个值。SortedMap:有序的键值对接口,继承Map接口。NavigableMap:继承SortedMap,具有了针对给定搜索目标返回最接近匹配项的导航方法的接口。AbstractMap:实现了Map中的绝大部分函数接口。它减少了“Map的实现类”的重复编码。Dictionary:转载 2017-05-23 09:18:18 · 309 阅读 · 0 评论 -
JAVA 读取Properties配置文件
一般使用:Properties properties = new Properties(); InputStream inputStream = this.getClass()..getClassLoader().getResourceAsStream("reflect/example/factory.properties"); properties.load(inp原创 2017-04-16 22:35:22 · 547 阅读 · 0 评论 -
JAVA 反射机制详解
反射机制是什么反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。反射机制能做什么反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;原创 2017-04-16 22:27:57 · 343 阅读 · 0 评论 -
JAVA 网络编程
网络基础知识(参考计算机网络)两台计算机间进行通讯需要以下三个条件: IP地址、协议、端口号TCP/IP协议:是目前世界上应用最为广泛的协议,是以TCP和IP为基础的不同层次上多个协议的集合,也成TCP/IP协议族、或TCP/IP协议栈 TCP:Transmission Control Protocol 传输控制协议 IP:Internet Protocol 互联原创 2017-04-16 16:36:44 · 259 阅读 · 0 评论 -
JAVA 多线程学习资源
博客:多线程的基本概念和使用http://blog.csdn.net/LonelyRoamer/article/details/7948329线程的生命周期和状态控制http://blog.csdn.net/LonelyRoamer/article/details/7949969线程同步http://blog.csdn.net/LonelyRoamer/article/details/7956097原创 2017-04-15 16:02:10 · 382 阅读 · 0 评论