Java原理
文章平均质量分 89
DreamMakers
凡办大事,以识为主,以才为辅,凡成大事,人谋居半,天意居半。
展开
-
Struts2请求处理流程及源码分析
转载自:http://my.oschina.net/xianggao/blog/755141.1 Struts2请求处理1. 一个请求在Struts2框架中的处理步骤:a) 客户端初始化一个指向Servlet容器的请求;b) 根据Web.xml配置,请求首先经过ActionContextCleanUp过滤器,其为可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助(Si转载 2012-11-10 23:17:55 · 721 阅读 · 0 评论 -
Java并发容器之CopyOnWriteArraySet
在这篇文章中来说下Java并发容器中的CopyOnWriteArraySet。CopyOnWriteArraySet是基于CopyOnWriteArrayList容器来实现相关功能的,如下所示: private final CopyOnWriteArrayList<E> al; /** * Creates an empty set. */ p...原创 2018-05-02 12:18:44 · 386 阅读 · 0 评论 -
Java并发容器之ConcurrentHashMap
在这篇文章中来看看线程安全的ConcurrentHashMap。讲到Map结构,我想应该都会知道HashTable和HashMap,但是这两者有什么区别呢?HashTable是线程安全的Map数据结构,因为它内部的操作方法都是通过synchronized关键字进行修饰的,确保了并发情况下不会对元素操作存在冲突。而HashMap是非线程安全的,在并发读取的情况下存在死循环的问题,这在另一篇文章《Ha...原创 2018-05-02 13:14:19 · 526 阅读 · 0 评论 -
Java并发与锁设计实现详述(10)- Java中的等待/通知机制
Java中的等待/通知机制是实现线程间通信的一种方式,是通过wait/notify/notifyAll等方法来完成的,这些方法又是什么含义呢?下面罗列了一下:等待/通知的相关方法方法名称描述notify()通知一个在对象上等待的线程,使其从wait()方法返回,而返回的前提是该线程获取到对象的锁notifyAll()通知所有等待在该对象上的线程,但是这些线程还需要竞争去获取对象锁wait()调用该...原创 2018-04-21 17:27:47 · 1051 阅读 · 0 评论 -
Java中hash算法细述
你知道HashMap中hash方法的具体实现吗?你知道HashTable、ConcurrentHashMap中hash方法的实现以及原因吗?你知道为什么要这么实现吗?你知道为什么JDK 7和JDK 8中hash方法实现的不同以及区别吗?如果你不能很好的回答这些问题,那么你需要好好看看这篇文章。文中涉及到大量代码和计算机底层原理知识。绝对的干货满满。整个互联网,把hash()分析的如此透彻的,别无二...转载 2018-05-09 21:59:09 · 37097 阅读 · 15 评论 -
JDK1.7中HashTable的hash为什么对素数求余,而不像HashMap中一样对2的N次方求余?
常用的hash函数是选一个数m取模(余数),这个数在课本中推荐m是素数,但是经常见到选择m=2^n,因为对2^n求余数更快,并认为在key分布均匀的情况下,key%m也是在[0,m-1]区间均匀分布的。但实际上,key%m的分布同m是有关的。证明如下:key%m = key - xm,即key减掉m的某个倍数x,剩下比m小的部分就是key除以m的余数。显然,x等于key/m的整数部分,...转载 2018-05-09 22:13:12 · 1194 阅读 · 1 评论 -
Java并发与锁设计实现详述(13)- Java并发容器
关于Java中的并发容器,可参考以下文章,由于精力问题,这里只描述了几个典型的容器,在后期会不断更新补充:《Java并发容器之CopyOnWriteArrayList 》《Java并发容器之CopyOnWriteArraySet 》《Java并发容器之ConcurrentHashMap 》《Java并发容器之有界阻塞队列ArrayBlockingQueue ...原创 2018-05-17 19:08:57 · 404 阅读 · 0 评论 -
一致性哈希算法
在讲本文的主题之前,我们先来看一个现实中的应用场景,那就是分布式缓存。场景描述:假设我们现在有三台服务器用于缓存我们的一些文件,比如图片。我么将这三台服务器进行编号便于后面的描述,分别为0号、1号和2号。比如说我们现在大量的图片需要缓存在这些服务器上面,在实际应用中,我们当然希望这些图片能够均匀的分布在各个服务器上面,从而将每台服务器的访问压力尽可能降低。假设我们有三万张图片,那么在我们的三台服务...原创 2018-05-11 17:38:29 · 821 阅读 · 0 评论 -
Java并发容器之有界阻塞队列ArrayBlockingQueue
在这篇文章中,我们来看下另一个线程安全的队列容器,那就是ArrayBlockingQueue。它是基于数组实现的有界阻塞队列。以JDK1.7为参考,ArrayBlockingQueue的类图结构如下所示:在ArrayBlockingQueue内部采用数组来保存队列元素,同时维护两个变量putIndex和takeIndex来标识插入元素和获取元素的下标位置,同时定义了count变量用来统计队列元素个...原创 2018-05-07 18:55:17 · 1713 阅读 · 0 评论 -
Java并发容器之阻塞队列LinkedBlockingQueue
在前一篇文章《Java并发容器之有界阻塞队列ArrayBlockingQueue》中讲到了阻塞队列,提到了ArrayBlockingQueue,在这篇文章中我们来看另一种线程安全的阻塞队列实现-LinkedBlockingQueue。ArrayBlockingQueue底层使用数组来保存队列元素,但是LinkedBlockingQueue底层使用列表来保存队列元素。下面我们先对LinkedBloc...原创 2018-05-15 22:47:54 · 1024 阅读 · 0 评论 -
Java注解
在这篇文章中,对Java中的一个非常核心且重要的内容进行讲述,是什么呢?没错,就是注解!!!为什么要说注解?注解有什么用?怎么使用注解?怎么创建自定义的注解?。。。在这篇文章中,我们结合目前使用比较热的fastjson来说明注解。为什么要说注解?注解有什么用?之所以说注解,是因为注解能给我们提供非常方便的实现某些代码逻辑之外事情的方式,尤其在一些框架、工具中注解非常常见(就像fastjson,本身...原创 2018-06-28 22:13:33 · 998 阅读 · 0 评论 -
Java并发与锁设计实现详述(5)- AQS(AbstractQueuedSynchronizer)的实现
在这篇文章中我们来看一个非常非常重要的东西,那就是AbstractQueuedSynchronizer,简称AQS,又叫队列同步器。为什么说它重要呢?因为它是Java并发包Java.util.concurrent的核心所在,讲到Java并发,如果不知道AQS那你说你懂并发可能就有点过了^_^Java.util.concurrent并发包是谁写的呢?是下面这个大神Doug Lea,先来看一眼,虽然这...原创 2018-04-07 09:19:18 · 945 阅读 · 0 评论 -
漫画:什么是ConcurrentHashMap?
———————————— ———————————— 前两期我们讲解了HashMap的基本原理,以及高并发场景下存在的问题。没看过的小伙伴可以点击下面链接: 如果实在懒得看也没有关系,我们来简单回顾一下HashMap的结构: 简单来说,HashMap是一个Entry对象的数组。数组中的每一个Entry元素,又是一个链表的头节点。 Hashmap不是线程安全的。在...转载 2018-04-22 19:54:35 · 701 阅读 · 0 评论 -
Java集合框架之小结
1、Java容器类库的简化图,下面是集合类库更加完备的图。包括抽象类和遗留构件(不包括Queue的实现): 2、ArrayList初始化时不可指定容量,如果以new ArrayList()方式创建时,初始容量为10个;如果以new ArrayList(Collection c)初始化时,容量为c.size()*1.1,即增加10%的容量;当向ArrayList中添加一个元素时,先进转载 2013-05-05 22:04:58 · 889 阅读 · 0 评论 -
JAVA多线程程序设计23个要点
1.多线程中有主内存和工作内存之分, 在JVM中,有一个主内存,专门负责所有线程共享数据;而每个线程都有他自己私有的工作内存, 主内存和工作内存分贝在JVM的stack区和heap区。 2.线程的状态有'Ready', 'Running', 'Sleeping', 'Blocked', 和 'Waiting'几个状态,'Ready' 表示线程正在等待CPU分配允许运行的时间。转载 2013-07-17 23:12:09 · 856 阅读 · 0 评论 -
JAVA中synchronized和lock详解
目前在Java中存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea。本文并不比较synchronized与Lock孰优孰劣,只是介绍二者的实现原理。 数据同步需要依赖锁,那锁的同步又依赖谁?synchronized给出的答案是在软件层面依赖JVM,而Lock给出的方案是在硬件层面依赖特殊的CPU转载 2013-09-04 11:12:15 · 4682 阅读 · 2 评论 -
Java中如何查看字节码?
之前一直没怎么看过Java中的字节码,也没尝试怎么去看过,最近准备深入研究一下Java并发和锁相关的东西,发现字节码是绕不过了,所谓“工欲善其事,必先利其器”,所以我们得先知道怎么去看字节码。这里,给出两种方式去查看字节码,一种是控制台,一种是图形化界面工具。(1)控制台要看字节码,首先你得知道你想看的字节码对应的class文件,这个class文件是有java文件经过编译而来的,至于怎么编译,可以...原创 2018-03-12 10:22:21 · 3053 阅读 · 0 评论 -
minor.major version 详解
从 JDK 1.1 到 JDK 1.7 编译器编译出的 class 的默认 minor.major version 吧。(又走到 Sun 的网站上翻腾出我从来都没用过的古董来)JDK 编译器版本target 参数十六进制 minor.major十进制 minor.majorjdk1.1.8不能带 target 参数00 03 00 2D45.3jdk1.2.2不...转载 2018-03-12 10:35:33 · 2672 阅读 · 0 评论 -
Java并发与锁设计实现详述(6)- 聊一聊Unsafe
UnSafe这个类是什么?我相信刚接触Java的人或者没有深入研究过Java的人应该都不会知道存在这个类。这个类是干嘛的呢?在讲并发的这个系列里为什么我要提它呢?答案很简单,那就是这个类对于并发非常重要,当然它的重要性不仅体现在对并发的支持上。之所以这篇文章说到UnSafe,是因为UnSafe类是同步队列器AbstractQueuedSynchronizer的重要组成部分,是AbstractQue...原创 2018-03-29 17:50:21 · 2298 阅读 · 0 评论 -
Java并发与锁设计实现详述(7)- Java并发类CountDownLatch、CyclicBarrier、Semaphore
在前面的文章中,我们对AQS(AbstractQueuedSynchronizer)进行了说明,AQS提供的是同步器的基本实现框架,在Java中我们并不是直接用AQS,因为它本身就是抽象的,我们只能用它的继承类。在这一篇文章中,我们就来看看几个基于AQS的同步器,仔细研究一下它们的原理及使用。在JDK中,基于AQS实现的同步器主要有CountDownLatch、CyclicBarrier、Sema...原创 2018-04-08 17:46:59 · 436 阅读 · 0 评论 -
Java并发与锁设计实现详述(9)- 关键字volatile底层原理
我们都知道volatile关键字是用来实现变量在多线程之间的可见性的,它是java.lang.concurrnt包的核心。在这篇文章中将简单描述它是如何保证变量在多线程之间的可见性的。在此之前,可能需要先要了解一点CPU缓存的相关知识,从而保证我们更好的准确的使用volatile关键字。CPU缓存首先来看看CPU缓存,CPU缓存的出现主要是用来解决CPU运算速度和内存读取速度的不匹配问题,因为CP...原创 2018-03-27 22:36:18 · 440 阅读 · 0 评论 -
Java并发与锁设计实现详述(11)- Java中的Condition
关于等待通知机制,在Java中主要有两种方式。一种是基于wait/notify方法集合synchronized关键字实现的,这在上一篇文章《Java并发与锁设计实现详述(10)- Java中的等待/通知机制》中已经讲述了,另一种方法是Condition结合Lock来实现。下面先把这两种方式进行一个简单的对比。Object的监控器方法和Condition接口的对比对比项Object Monitor ...原创 2018-04-22 00:20:01 · 6418 阅读 · 0 评论 -
HashMap死循环问题
大家都知道,相比于HashTable,HashMap是一个非线程安全的实现类。为什么说HashMap是非线程安全的呢?因为在高并发情况下,HashMap在一些操作上会存在问题,如死循环问题,导致CPU使用率较高。下面来看下怎么复现这个问题。如下代码所示,我们创建10个线程,这10个线程并发向一个HashMap种添加元素。package com.majing.java.concurrent;im...原创 2018-04-22 18:31:20 · 14132 阅读 · 15 评论 -
java中多种写文件方式的效率对比实验
1. 实验背景最近在考虑一个问题:“如果快速地向文件中写入数据”,java提供了多种文件写入的方式,效率上各有异同,基本上可以分为如下三大类:字节流输出、字符流输出、内存文件映射输出。前两种又可以分为带buffer及不带buffer2. 实验目标通过实验找出单线程场景下文件写入效率最高的方式,并量化各种文件写入方式在效率上的差距。3. 实验设计为减少其他环节的影...转载 2019-03-24 10:59:15 · 1781 阅读 · 0 评论