Java
vernonzheng
java/clojure/nodejs/python
关注大型服务器程序开发、中间件、系统架构、分布式、大数据等等。
blog:vernonzheng.com
email:kevonzheng@gmail.com
豆瓣:http://www.douban.com/people/79461162/
github:https://github.com/vernonzheng
展开
-
java 堆和栈的区别
Java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等 指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时 动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,转载 2011-09-20 15:24:25 · 1283 阅读 · 1 评论 -
Java多线程(二)之Atomic:原子变量与原子类
一、何谓Atomic? Atomic一词跟原子有点关系,后者曾被人认为是最小物质的单位。计算机中的Atomic是指不能分割成若干部分的意思。如果一段代码被认为是Atomic,则表示这段代码在执行过程中,是不能被中断的。通常来说,原子指令由硬件提供,供软件来实现原子方法(某个线程进入该方法后,就不会被中断,直到其执行完成) 在x86 平台上,CPU提供了在指令执行期原创 2012-11-21 09:19:35 · 19828 阅读 · 1 评论 -
Java多线程(五)之BlockingQueue深入分析
一、概述:BlockingQueue作为线程容器,可以为线程同步提供有力的保障。二、BlockingQueue定义的常用方法1.BlockingQueue定义的常用方法如下: 抛出异常特殊值阻塞超时插入add(e)offer(e)put(e)offer(e, time, unit)移除原创 2012-12-01 23:15:41 · 67696 阅读 · 16 评论 -
Java多线程(七)之同步器基础:AQS框架深入分析
一、什么是同步器多线程并发的执行,之间通过某种 共享 状态来同步,只有当状态满足 xxxx 条件,才能触发线程执行 xxxx 。这个共同的语义可以称之为同步器。可以认为以上所有的锁机制都可以基于同步器定制来实现的。而juc(java.util.concurrent)里的思想是 将这些场景抽象出来的语义通过统一的同步框架来支持。juc 里所有的这些锁机制都是基原创 2012-12-09 20:38:03 · 30448 阅读 · 5 评论 -
Java多线程(八)之Semaphore、CountDownLatch、CyclicBarrier、Exchanger
一、引言Semaphore :一个计数信号量CountDownLatch :一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。 CyclicBarrier :一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 Exchanger原创 2012-12-10 22:50:10 · 8616 阅读 · 2 评论 -
java中的IO整理
写在前面:本文章基本覆盖了java IO的全部内容,java新IO没有涉及,因为我想和这个分开,以突出那个的重要性,新IO哪一篇文章还没有开始写,估计很快就能和大家见面。照旧,文章依旧以例子为主,因为讲解内容的java书很多了,我觉的学以致用才是真。代码是写出来的,不是看出来的。最后欢迎大家提出意见和建议。【案例1】创建一个新文件?12345转载 2012-12-11 21:31:54 · 2819 阅读 · 0 评论 -
Java IO流分析、IO整理与IO优化
一、IO流的概念Java中对文件的操作是以流的方式进行的。流是Java内存中的一组有序数据序列。Java将数据从源(文件、内存、键盘、网络)读入到内存中,形成了流,然后将这些流还可以写到另外的目的地(文件、内存、控制台、网络),之所以称为流,是因为这个数据序列在不同时刻所操作的是源的不同部分。二、IO流的分类Java中的流,可以从不同的角度进行分类。按照数据原创 2012-12-11 22:13:06 · 6182 阅读 · 4 评论 -
Java多线程(九)之ReentrantLock与Condition
一、ReentrantLock 类1.1 什么是reentrantlockjava.util.concurrent.lock 中的 Lock 框架是锁定的一个抽象,它允许把锁定的实现作为 Java 类,而不是作为语言的特性来实现。这就为 Lock 的多种实现留下了空间,各种实现可能有不同的调度算法、性能特性或者锁定语义。 ReentrantLock 类实现了 Lock ,它原创 2012-12-12 21:41:39 · 56554 阅读 · 4 评论 -
Java多线程(十)之ReentrantReadWriteLock深入分析
一、ReentrantReadWriteLock与ReentrantLock 说到ReentrantReadWriteLock,首先要做的是与ReentrantLock划清界限。它和后者都是单独的实现,彼此之间没有继承或实现的关系。ReentrantLock实现了标准的互斥操作,也就是一次只能有一个线程持有锁,也即所谓独占锁的概念。前面的章节中一直在强调这个特点。显然原创 2012-12-15 00:02:08 · 8189 阅读 · 4 评论 -
Java多线程(十二)之线程池深入分析(下)
一、数据结构与线程构造方法由于已经看到了ThreadPoolExecutor的源码,因此很容易就看到了ThreadPoolExecutor线程池的数据结构。图1描述了这种数据结构。图1 ThreadPoolExecutor 数据结构其实,即使没有上述图形描述ThreadPoolExecutor的数据结构,我们根据线程池的要求也很能够猜测出其数据结构出来。原创 2012-12-15 22:48:55 · 7355 阅读 · 6 评论 -
Java多线程(十一)之线程池深入分析(上)
线程池是并发包里面很重要的一部分,在实际情况中也是使用很多的一个重要组件。下图描述的是线程池API的一部分。广义上的完整线程池可能还包括Thread/Runnable、Timer/TimerTask等部分。这里只介绍主要的和高级的API以及架构和原理。大多数并发应用程序是围绕执行任务(Task)进行管理的。所谓任务就是抽象、离散的工作单元(unit of work)。把一个原创 2012-12-15 15:58:39 · 14517 阅读 · 12 评论 -
深入JVM系列(一)之内存模型与内存分配
一、JVM内存区域划分大多数 JVM 将内存区域划分为 Method Area(Non-Heap),Heap,Program Counter Register,Java Method Stack,Native Method Stack 和Direct Memomry(注意 Directory Memory 并不属于 JVM 管理的内存区域)。前三者一般译为:方法区、堆、程序计数器。原创 2013-01-02 11:43:38 · 15464 阅读 · 16 评论 -
深入JVM系列(二)之GC机制、收集器与GC调优
一、回顾JVM内存分配需要了解更多内存模式与内存分配的,请看 深入JVM系列(一)之内存模型与内存分配1.1、内存分配:1、对象优先在EDEN分配2、大对象直接进入老年代 3、长期存活的对象将进入老年代 4、适龄对象也可能进入老年代:动态对象年龄判断动态对象年龄判断:虚拟机并不总是要求对象的年龄必须达到MaxTenuringThresho原创 2013-01-03 00:07:48 · 12336 阅读 · 8 评论 -
深入JVM系列(三)之类加载、类加载器、双亲委派机制与常见问题
一.概述定义:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型。类加载和连接的过程都是在运行期间完成的。二. 类的加载方式1):本地编译好的class中直接加载2):网络加载:java.net.URLClassLoader可以加载url指定的类3):从jar、zip等等压缩文件原创 2013-01-03 16:19:15 · 12981 阅读 · 5 评论 -
Java多线程(一)之volatile深入分析
volatile 变量提供了线程的可见性,并不能保证线程安全性和原子性。什么是线程的可见性:锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility)。互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据。可见性要更加复杂一些,它必须确保释放锁之前原创 2012-11-19 23:29:55 · 11356 阅读 · 8 评论 -
Java多线程(三)之ConcurrentHashMap深入分析
一、Map体系Hashtable是JDK 5之前Map唯一线程安全的内置实现(Collections.synchronizedMap不算)。Hashtable继承的是Dictionary(Hashtable是其唯一公开的子类),并不继承AbstractMap或者HashMap。尽管Hashtable和HashMap的结构非常类似,但是他们之间并没有多大联系。Concurrent原创 2012-11-29 21:56:28 · 8399 阅读 · 3 评论 -
Java多线程(四)之ConcurrentSkipListMap深入分析
一、前言 concurrentHashMap与ConcurrentSkipListMap性能测试在4线程1.6万数据的条件下,ConcurrentHashMap 存取速度是ConcurrentSkipListMap 的4倍左右。但ConcurrentSkipListMap有几个ConcurrentHashMap 不能比拟的优点:1、ConcurrentSkipLis原创 2012-11-30 21:10:44 · 12127 阅读 · 5 评论 -
关于类型转换——byte类型相加引发的编译出错
由一道题引入:public class BadArithmetic { static byte addOneAndOne(){ byte a = 1; byte b = 1; byte c = a+b; return c; }}在低版本的eclipse中,结果是编译错误:BadArithmetic.java (7): Incompatible type f原创 2011-09-13 23:31:16 · 1712 阅读 · 0 评论 -
Runtime.exec() 的陷阱
原文地址:http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=4作为Java语言的一部分。java.lang包被隐藏的导入到每一个Java程序。这个包的表面陷阱,经常影响到大多数程序员。这个月,我将讨论运行时exec()方法时的潜伏陷阱。陷阱4:当运行exec()不会java.lang.Ru翻译 2012-11-25 13:54:32 · 10224 阅读 · 2 评论 -
深入探究 java 泛型
Java泛型(generics)是JDK 5中引入的一个新特性,允许在定义类和接口的时候使用类型参数(type parameter)。声明的类型参数在使用时用具体的类型来替换。泛型最主要的应用是在JDK 5中的新集合类框架中。对于泛型概念的引入,开发社区的观点是褒贬不一。从好的方面来说,泛型的引入可以解决之前的集合类框架在使用过程中通常会出现的运行时刻类型错误,因为编译器可以在编译时刻就发现很转载 2011-11-28 10:04:34 · 1361 阅读 · 0 评论 -
System.gc()与Object.finalize()的区别
finalize()是由JVM自动调用的,你可以用System.gc(),但JVM不一定会立刻执行,JVM感觉内存空间有限时,才会开始执行finalize(),至于新的对象创建个数和被收集个数不同是因为收集的对象只和JVM的垃圾收集策略有关。1.构造函数要点:构建器(Constructor)属于一种较特殊的方法类型,因为它没有返回值.这与 void返回值存在着明显的区别。对于voi转载 2012-10-06 11:22:19 · 1630 阅读 · 0 评论 -
StringTokenizer类与String.split()的区别
一、StringTokenizer:字符串分隔解析类型属于:java.util包。1、构造函数。1. StringTokenizer(String str) :构造一个用来解析str的StringTokenizer对象。java默认的分隔符是“空格”、“制表符(‘\t’)”、“换行符(‘\n’)”、“回车符(‘\r’)”。2. StringTokenizer(Str原创 2012-11-10 19:28:17 · 9483 阅读 · 1 评论 -
java的concurrent用法详解
我们都知道,在JDK1.5之前,Java中要进行业务并发时,通常需要有程序员独立完成代码实现,当然也有一些开源的框架提供了这些功能,但是这些依然没有JDK自带的功能使用起来方便。而当针对高质量Java多线程并发程序设计时,为防止死蹦等现象的出现,比如使用java之前的wait()、notify()和synchronized等,每每需要考虑性能、死锁、公平性、资源管理以及如何避免线程安全性方面带来的转载 2012-10-12 11:04:25 · 3487 阅读 · 0 评论 -
原子变量AtomicInteger
An int value that may be updated atomically. See the java.util.concurrent.atomic package specification for description of the properties of atomic variables. An AtomicInteger is used in applic转载 2012-10-07 21:54:36 · 1805 阅读 · 6 评论 -
深入探讨 Java类加载器
kevon学习小结 《——————————可跳过,直接看原文——————————》: 一、使用类的顺序:(1).java编译成.class二进制文件(2)类加载器读取二进制文件,并转化为java.lang.Class的实例,每个实例表示一个java类(3)通过此实例 的newInstance方法创建一个对象。 加载类的顺序:LoadClass已封装,用编转载 2011-11-27 21:23:42 · 1315 阅读 · 0 评论 -
Java中equals()与hashCode()的原理与设计
1.何时需要重写equals()当一个类有自己特有的“逻辑相等”概念(不同于对象身份的概念)。2.为什么改写equals()的时候,总是要改写hashCode()两个原则:hashCode()的返回值和equals()的关系如下:如果x.equals(y)返回“true”,那么x和y的hashCode()必须相等。如果x.equals(y)返原创 2012-11-06 16:58:21 · 2293 阅读 · 0 评论 -
NIO入门
在开始之前关于本教程 新的输入/输出 (NIO) 库是在 JDK 1.4 中引入的。NIO 弥补了原来的 I/O 的不足,它在标准 Java 代码中提供了高速的、面向块的 I/O。通过定义包含数据的类,以及通过以块的形式处理这些数据,NIO 不用使用本机代码就可以利用低级优化,这是原来的 I/O 包所无法做到的。在本教程中,我们将讨论 NIO 库的几乎所有方面,从高级的概念性内容到底层转载 2011-11-23 16:54:29 · 201 阅读 · 0 评论 -
Java中断的本质与分析
一、Java中断的现象首先,看看Thread类里的几个方法:public static boolean interrupted测试当前线程是否已经中断。线程的中断状态 由该方法清除。换句话说,如果连续两次调用该方法,则第二次调用将返回 false(在第一次调用已清除了其中断状态之后,且第二次调用检验完中断状态前,当前线程再次中断的情况除外)。publ原创 2012-12-02 21:52:03 · 3683 阅读 · 0 评论 -
Java HashMap实现详解
1. HashMap概述: HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 2. HashMap的数据结构: 在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构转载 2012-11-01 23:16:20 · 1786 阅读 · 1 评论 -
Java多线程(六)之Deque与LinkedBlockingDeque深入分析
一、双向队列DequeQueue除了前面介绍的实现外,还有一种双向的Queue实现Deque。这种队列允许在队列头和尾部进行入队出队操作,因此在功能上比Queue显然要更复杂。下图描述的是Deque的完整体系图。需要说明的是LinkedList也已经加入了Deque的一部分(LinkedList是从jdk1.2 开始就存在数据结构)。 Deque在Q原创 2012-12-07 00:00:22 · 21659 阅读 · 2 评论 -
Java中Runtime.getRuntime().exec()错误:Cannot allocate memory!
用java的Runtime.getRuntime().exec(cmd)方式,执行aapt命令行解包apk文件时,遇到“Cannot allocate memory”的错误。但是直接在linux上使用aapt命令可以正常使用。网上查询资料整理如下:Cannot allocate memory在Linux上调试一个比较复杂的Java程序,称为JavaA吧,原创 2013-03-07 09:20:47 · 6655 阅读 · 9 评论