
Java
文章平均质量分 62
Hsuxu
程序猿
展开
-
HotSpot VM的生命周期
1.启动:(1) 解析命令行参数:如-client 或 -server(2)分配java的堆和选择好确定的JIT编译器类型(client 或 server)、(3) 创建运行环境如LD_LIBRARY_PATH和CLASSPATH(4)找到Main-Class(5) 使用标准的java Native接口方法:JNI_CreateJavaVM在一个新创建的非原生的线程中创建Hot原创 2013-09-14 15:49:58 · 1932 阅读 · 0 评论 -
Java的synchronized关键字:同步机制总结
不久前用到了同步,现在回过头来对JAVA中的同步做个总结,以对前段时间工作的总结和自我技术的条理话。JAVA的synchronized关键字能够作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块。假如再细的分类,synchronized可作用于instance变量、object reference(对象引用)、static函数和class literals(类名称字面常量)转载 2013-07-14 15:25:19 · 1242 阅读 · 0 评论 -
互斥锁 自旋锁 自适应自旋锁
互斥锁:从 实现原理上来讲,Mutex属于sleep-waiting类型的锁。例如在一个双核的机器上有两个线程(线程A和线程B),它们分别运行在Core0和 Core1上。假设线程A想要通过pthread_mutex_lock操作去得到一个临界区的锁,而此时这个锁正被线程B所持有,那么线程A就会被阻塞 (blocking),Core0 会在此时进行上下文切换(Context Switch)将线转载 2013-07-14 13:58:47 · 3468 阅读 · 0 评论 -
闲聊ClassLoader的父加载器
Java使用类加载器来装载字节码到内存,以便后续用来创建对象调用方法等。就目前的JVM,要说这个ClassLoader,先要说到它的委托模型(有人将parent译作双亲,双亲委派模型,窃以为,很不准确,原因在说完这个委托模型之后讲)。何为委托模型?java.lang.ClassLoader有这样的描述:每个 ClassLoader 实例都有一个相关的父类加载器。需要查找类或资源时,Class转载 2013-07-14 12:25:50 · 4811 阅读 · 0 评论 -
differences between “java -server” and “java -client”
From Chapter 2 of the whitepaper (The Java HotSpot Performance Engine Architecture):The JDK includes two flavors of the VM -- a client-side offering, and a VM tuned for server applications. Thes转载 2013-07-14 17:14:33 · 1022 阅读 · 0 评论 -
java 文件锁
JDK 1.4引入了文件加锁机制,允许我们同步访问一个共享文件,不过,竞争同一文件的两个线程有可能在不同的java虚拟机上,或者一个是java线程,另一个是操作系统中其他的某个线程,但文件锁对其他线程或其他操作系统进程都是可见的,因为java的文件加锁直接映射到了本地操作系统的加锁机制。注,这里讲的锁是指锁定其他应用程序,而不是锁定同一虚拟机里访问的同一文件的其他线程 。如果在同一虚拟机两原创 2013-06-27 21:04:17 · 1286 阅读 · 0 评论 -
JAVA类装载器classloader和命名空间namespace
JAVA类装载器classloader和命名空间namespace JAVA虚拟机通过装载、连接和初始化一个JAVA类型,使该类型可以被正在运行的JAVA程序所使用。其中,装载就是把二进制形式的JAVA类型读入JAVA虚拟机中。连接就是把这种已经读入虚拟机的二进制形式的类型数据合并到虚拟机的运行时状态中去。连接阶段分为三个步骤-验证、准备和解析。验证确保了JAVA类型数据格式正确并适于JAV转载 2013-06-07 16:06:24 · 1890 阅读 · 0 评论 -
What is the difference between NoClassDefFoundError and ClassNotFoundException?
The difference from the Java API Specifications is as follows.For ClassNotFoundException:Thrown when an application tries to load in a class through its string name using:The forName m转载 2013-05-28 23:19:24 · 1784 阅读 · 0 评论 -
Top 15 Java threading interview questions asked in Investment banks
Thread interview questions JavaMulti-threading and concurrency questions are essential part of any Java interview. If you are going for any Java interview on any Investment bank for equities front o转载 2013-07-12 20:02:13 · 1830 阅读 · 0 评论 -
Java: notify() vs. notifyAll()
Simply put, it depends on why your threads are waiting to be notified. Do you want to tell one of the waiting threads that something happened, or do you want to tell all of them at the same time?In转载 2013-07-12 18:58:26 · 2084 阅读 · 0 评论 -
Java并发编程之ConcurrentHashMap
ConcurrentHashMapConcurrentHashMap是一个线程安全的Hash Table,它的主要功能是提供了一组和HashTable功能相同但是线程安全的方法。ConcurrentHashMap可以做到读取数据不加锁,并且其内部的结构可以让其在进行写操作的时候能够将锁的粒度保持地尽量地小,不用对整个ConcurrentHashMap加锁。ConcurrentHashMap转载 2013-07-24 20:45:24 · 3135 阅读 · 1 评论 -
JAVA CAS原理深度分析
看了一堆文章,终于把JAVA CAS的原理深入分析清楚了。感谢GOOGLE强大的搜索,借此挖苦下百度,依靠百度什么都学习不到! 参考文档:http://www.blogjava.net/xylz/archive/2010/07/04/325206.htmlhttp://blog.hesey.net/2011/09/resolve-aba-by-atomicstampedrefe转载 2013-07-25 13:07:33 · 169368 阅读 · 42 评论 -
ConcurrentLinkedQueue的实现原理分析
1. 引言在并发编程中我们有时候需要使用线程安全的队列。如果我们要实现一个线程安全的队列有两种实现方式:一种是使用阻塞算法,另一种是使用非阻塞算法。使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现,而非阻塞的实现方式则可以使用循环CAS的方式来实现,本文让我们一起来研究下Doug Lea是如何使用非阻塞的方式来实现线程安全队列Concurren转载 2013-07-25 19:54:06 · 1144 阅读 · 0 评论 -
深入理解Java内存模型(六)——final
与前面介绍的锁和volatile相比较,对final域的读和写更像是普通的变量访问。对于final域,编译器和处理器要遵守两个重排序规则:在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。下面,我们通过一些示例性的代码转载 2013-08-23 14:25:58 · 1833 阅读 · 0 评论 -
深入理解Java内存模型(四)——volatile
volatile的特性当我们声明共享变量为volatile后,对这个变量的读/写将会很特别。理解volatile特性的一个好方法是:把对volatile变量的单个读/写,看成是使用同一个监视器锁对这些单个读/写操作做了同步。下面我们通过具体的示例来说明,请看下面的示例代码:class VolatileFeaturesExample { volatile long vl = 0L转载 2013-08-23 14:25:08 · 2434 阅读 · 0 评论 -
Java NIO 选择器(Selector)的内部实现(poll epoll)
之前强调这么多关于linux内核的poll及epoll,无非是想让大家先有个认识:Java NIO中的选择器依赖操作系统内核的这些系统调用,我们这里只讲解与linux内核相关的NIO实现,当然,windows或其他操作系统实现大体上是类似的,相信大家也可以触类旁通。那么,本文从这里将从简到难,一步一步为大家讲解选择器的点点滴滴吧。选择器的宏观理解“有这么一种转载 2013-08-10 14:41:31 · 30746 阅读 · 3 评论 -
文件锁(Filelock) 与锁定映射文件部分内容
文件锁JDK 1.4引入了文件加锁机制,允许我们同步访问一个共享文件,不过,竞争同一文件的两个线程有可能在不同的java虚拟机上,或者一个是java线程,另一个是操作系统中其他的某个线程,但文件锁对其他线程或其他操作系统进程都是可见的,因为java的文件加锁直接映射到了本地操作系统的加锁机制。注,这里讲的锁是指锁定其他应用程序,而不是锁定同一虚拟机里访问的同一文件的其他线程 。如果在同一虚转载 2013-07-25 20:34:28 · 1869 阅读 · 0 评论 -
Java轻量级锁原理详解(Lightweight Locking)
大家知道,Java的多线程安全是基于Lock机制实现的,而Lock的性能往往不如人意。原因是,monitorenter与monitorexit这两个控制多线程同步的bytecode原语,是JVM依赖操作系统互斥(mutex)来实现的。互斥是一种会导致线程挂起,并在较短的时间内又需要重新调度回原线程的,较为消耗资源的操作。为了优化Java的Lock机制,从Java6开始引入了轻量级锁的概转载 2013-07-25 18:45:18 · 4802 阅读 · 0 评论 -
Synchronization and the Java Memory Model
This set of excerpts from section 2.2 includes the main discussions on how the Java Memory Model impacts concurrent programming.For information about ongoing work on the memory model, see Bill Pug转载 2013-07-26 13:06:57 · 1373 阅读 · 0 评论 -
深入JVM锁机制
目前在Java中存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea。本文并不比较synchronized与Lock孰优孰劣,只是介绍二者的实现原理。数据同步需要依赖锁,那锁的同步又依赖谁?synchronized给出的答案是在软件层面依赖JVM,而Lock给出的方案是在硬件层面依赖特殊的CPU指令,大家可能转载 2013-07-25 18:49:01 · 2513 阅读 · 0 评论 -
Java偏向锁实现原理(Biased Locking)
阅读本文的读者,需要对Java轻量级锁有一定的了解,知道lock record, mark word之类的名词。可以参考我的一篇博文:Java轻量级锁原理详解(Lightweight Locking)Java偏向锁(Biased Locking)是Java6引入的一项多线程优化。它通过消除资源无竞争情况下的同步原语,进一步提高了程序的运行性能。轻量级锁也是一种多线程优化,它与偏向锁的区别在转载 2013-07-25 18:44:49 · 6115 阅读 · 0 评论 -
java中的Synchronized 实现
1 引言在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重量级锁,但是随着Java SE1.6对Synchronized进行了各种优化之后,有些情况下它并不那么重了,本文详细介绍了Java SE1.6中为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁,以及锁的存储结构和升级过程。3 同步的基础Java中的每一个对象都可以作为锁。对于同步转载 2013-07-25 18:43:54 · 4115 阅读 · 0 评论 -
JIT(动态编译)和AOT(静态编译)编译技术比较
Java 应用程序的性能经常成为开发社区中的讨论热点。因为该语言的设计初衷是使用解释的方式支持应用程序的可移植性目标,早期 Java 运行时所提供的性能级别远低于 C 和 C++ 之类的编译语言。尽管这些语言可以提供更高的性能,但是生成的代码只能在有限的几种系统上执行。在过去的十年中,Java 运行时供应商开发了一些复杂的动态编译器,通常称作即时(Just-in-time,JIT)编译器。程序运行转载 2013-07-13 20:51:27 · 31215 阅读 · 0 评论 -
Tomcat ClassLoader机制介绍
本文旨在介绍JVM的类加载机制;同时分析Tomcat不能采用默认的加载机制的原因,并对其加载机制做了介绍。1、JVM中的类加载机制在Java2之后的版本中,类的加载采用的是一种称为双亲委派的代理模型:也就是说当前ClassLoader在加载类前,先委派给双亲去加载类;在有双亲委派模式的情况下,启动类装载器可以抢在标准扩展类装载器之前去装载类,而标准扩展类装载器可以抢在系统类装载转载 2013-06-16 14:31:20 · 1211 阅读 · 0 评论 -
java线程系列---Runnable和Thread的区别
在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限, 下面看例子: package org.thread.demo; class MyThread转载 2013-02-18 19:56:26 · 1095 阅读 · 1 评论 -
Java:使用wait()与notify()实现线程间协作
使用wait()与notify()/notifyAll()可以使得多个任务之间彼此协作。1. wait()与notify()/notifyAll()调用sleep()和yield()的时候锁并没有被释放,而调用wait()将释放锁。这样另一个任务(线程)可以获得当前对象的锁,从而进入它的synchronized方法中。可以通过notify()/notifyAll(),或者时间到期,从wai转载 2012-12-07 15:34:03 · 1146 阅读 · 0 评论 -
java线程安全
为一个Java web开发人员,很少也不需要去处理线程,因为服务器已经帮我们处理好了。记得大一刚学Java的时候,老师带着我们做了一个局域网聊天室,用到了AWT、Socket、多线程、I/O,编写的客户端和服务器,当时做出来很兴奋,回学校给同学们演示,感觉自己好NB,呵呵,扯远了。上次在百度开发者大会上看到一个提示语,自己写的代码,6个月不看也是别人的代码,自己学的知识也同样如此,学完的知识如果不转载 2012-11-30 10:19:11 · 1503 阅读 · 1 评论 -
深入探讨 java.lang.ref 包
概述Java.lang.ref 是 Java 类库中比较特殊的一个包,它提供了与 Java 垃圾回收器密切相关的引用类。这些引用类对象可以指向其它对象,但它们不同于一般的引用,因为它们的存在并不防碍 Java 垃圾回收器对它们所指向的对象进行回收。其好处就在于使者可以保持对使用对象的引用,同时 JVM 依然可以在内存不够用的时候对使用对象进行回收。因此这个包在用来实现与缓存相关的应用时特别转载 2012-08-01 15:40:18 · 1147 阅读 · 0 评论 -
深入Java集合学习系列:HashMap的实现原理
1. HashMap概述: HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 2. HashMap的数据结构: 在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本转载 2012-08-06 14:10:47 · 1208 阅读 · 0 评论 -
Hadoop InputFormat浅析--hadoop如何分配输入
在执行一个Job的时候,Hadoop会将输入数据划分成N个Split,然后启动相应的N个Map程序来分别处理它们。数据如何划分?Split如何调度(如何决定处理Split的Map程序应该运行在哪台TaskTracker机器上)?划分后的数据又如何读取?这就是本文所要讨论的问题。先从一张经典的MapReduce工作流程图出发:1、运行mapred程序;2、本次运行将生成一转载 2012-06-18 14:19:10 · 4486 阅读 · 2 评论 -
Collection接口和Map接口的主要实现类
Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”如List和Set。转载 2012-04-12 16:14:03 · 1338 阅读 · 0 评论 -
通过 HashMap、HashSet 的源代码分析其 Hash 存储机制
实际上,HashSet 和 HashMap 之间有很多相似之处,对于 HashSet 而言,系统采用 Hash 算法决定集合元素的存储位置,这样可以保证能快速存、取集合元素;对于 HashMap 而言,系统 key-value 当成一个整体进行处理,系统总是根据 Hash 算法来计算 key-value 的存储位置,这样可以保证能快速存、取 Map 的 key-value 对。在介绍集合存储之转载 2012-04-12 16:10:35 · 1023 阅读 · 0 评论 -
LinkedHashMap特性 按插入和访问顺序排序
LinkedHashMap的特性:Linked内部含有一个private transient Entry header;来记录元素插入的顺序或者是元素被访问的顺序。利用这个线性结构的对象,可以帮助记录entry加入的前后顺序或者记录entry被访问的频率(最少被访问的entry靠前,最近访问的entry靠后)。大致的过程如下:new LinkedHashMap(10, 0.75, tr转载 2012-04-12 15:55:48 · 6131 阅读 · 0 评论 -
JDBC之Statement,PreparedStatement,CallableStatement的区别
Statement 每次执行sql语句,数据库都要执行sql语句的编译 ,最好用于仅执行一次查询并返回结果的情形,效率高于PreparedStatement. PreparedStatement是预编译的,使用PreparedStatement有几个好处 a. 在执行可变参数的一条SQL时,PreparedStatement比Statement的效率高,因为DBMS预编译一转载 2013-04-10 14:01:20 · 1062 阅读 · 0 评论 -
Java:谈谈protected访问权限
来谈谈protected访问权限问题。看下面示例1:Test.javaclass MyObject {} publicclass Test { publicstaticvoid main(String[] args) { MyObject obj = new MyObject(); obj.clone(); //转载 2013-04-22 19:33:05 · 914 阅读 · 0 评论 -
Java枚举
用法一:常量在JDK1.5之前,我们定义常量都是:publicstaticfianl....。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。 Java代码 public enum Color { RED, GREEN, BLANK, YELLOW } 用法二:switchJDK1.6之前的swi转载 2013-04-22 20:52:50 · 876 阅读 · 0 评论 -
为什么需要Class.forName("com.mysql.jdbc.Driver")
在使用传统的JDBC连接数据库的时候,总是需要这一句(以MySQL为例):Class.forName("com.mysql.jdbc.Driver"); 以前我也没深究,只是看网上的例子都这么写,实际上也跑通了,于是便懒得去管内部原理。不过大概还是清楚的,知道这句话是向DriverManage注册了一个MySQL的JDBC Driver。但为什么要用Class.forName这样看转载 2013-06-13 18:16:04 · 2022 阅读 · 0 评论 -
线程池的原理及实现
1、线程池简介: 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。 假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间。 如果:T1 + T3 远大于 T2,则可以采用线程池,以提高服务器性能。 一个线程转载 2013-05-28 17:50:44 · 265076 阅读 · 49 评论 -
java序列化算法透析
Java序列化算法透析 Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization是一种将这些字节重建成一个对象的过程。Java序列化API提供一种处理对象序列化的标准机制。在这里你能学到如何序列化一个对象,什么时候需要序列化以及Java序列化的算法,我们用一个实例来示范序列化以后的字节是如何描述一个对象的信息的。 序列化的必要转载 2013-05-23 20:29:40 · 929 阅读 · 0 评论 -
转换流--OutputStreamWriter类与InputStreamReader
整个IO包实际上分为字节流和字符流,但是除了这两个流之外,还存在一组字节流-字符流的转换类。OutputStreamWriter:是Writer的子类,将输出的字符流变为字节流,即将一个字符流的输出对象变为字节流输出对象。InputStreamReader:是Reader的子类,将输入的字节流变为字符流,即将一个字节流的输入对象变为字符流的输入对象。(个人认为:不要管输入输出,其实就是转载 2013-05-23 19:30:09 · 881 阅读 · 0 评论