- 浏览: 46964 次
最新评论
文章列表
p49
在HptSpot虚拟机中,对象在内存中存储的布局可以分为三个区域,对象头,实例数据和对齐填充。
对象头:包含两部分信息,第一部分用于存储对象自身的运行时数据,例如哈希码,GC分代年龄,锁状态标识,线程所持有的锁 ...
- 2014-11-27 14:24
- 浏览 375
- 评论(0)
对象的创建
虚拟机在遇到一条new指令时,首先去检查这条指令的参数能否在常量池中定位到一个类的符号引用,并检查该类是否被加载过。如果没有,先执行类加载的过程。
类加载检查完成之后,接下来虚拟机为新生对象分配 ...
- 2014-11-27 13:47
- 浏览 304
- 评论(0)
在CSDN开了博客后,一直也没在上面发布过文章,直到前一段时间与一位前辈的对话,才发现技术博客的重要,立志要把CSDN的博客建好。但一直没有找到好的开篇的主题,今天再看JAVA线程互斥、同步的时候又有了新的体会,就以他作为开篇吧。
在JAVA中,是没有类似于PV操作、进程互斥等相关的方法的。JAVA的进程同步是通过synchronized()来实现的,需要说明的是,JAVA的synchronized()方法类似于操作系统概念中的互斥内存块,在JAVA中的Object类型中,都是带有一个内存锁的,在有线程获取该内存锁后,其它线程无法访问该内存,从而实现JAVA中简单的同步、互斥操作。明 ...
- 2014-11-17 14:17
- 浏览 293
- 评论(0)
在java.lang.Enum类中,所有的方法如下所示:
里面并没有values()静态方法,而在我们使用enum类时,例如:enum classA{
RED,GREEN
}
可以通过java编译器的提示得到values()静态方法,这是为什么呢?
这是由于java编译器在对enum关键字进行处理时,实际上是将enum转换成为了java.lang.Enum类的一个子类来完成,而这个子类中含有values()静态方法。这一点,可以通过反编译enum类来查看。
如图,通过javap反编译enum枚举类,可以看到编译器在对enum处理时,实际上是转换成了Enum的一个子类来实现 ...
- 2014-06-24 10:03
- 浏览 430
- 评论(0)
一、快排后取已经排好序的第k个元素即可
二、使用快速排序的划分,
Partion(seq,start,end) = p, 如果p=k 则ok。如果p >k,
则在start, p -1的区间里找第K大的数,Partion(seq,start,p-1)
否则partion(seq,p+1,end)。
算法的平均时间复杂度为O(N),最坏情况为N^2,即每次划分把数组变为为(n-1) 和1的两断。
三、建立大顶堆,每次删除顶上的最大元素。建堆复杂度为O(N)。而每次DeleteMax的复杂度为O(log(N))。所以总的复杂度为O(N+klog(N))。
...
- 2014-05-26 16:39
- 浏览 626
- 评论(0)
HashSet与ArrayList的最主要区别在于,在HashSet中的元素不会出现重复的。其内部实现机制如下:
为了保证在HashSet中出现重复元素,实际上,HashSet是通过一个内部的HashMap来实现元素唯一性。
private transient HashMap<E,Object> map;
// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
/**
...
- 2014-05-04 15:56
- 浏览 353
- 评论(0)
1. 引言
当我们点击某个杀毒软件的取消按钮来停止查杀病毒时,当我们在控制台敲入quit命令以结束某个后台服务时……都需要通过一个线程去取消另一个线程正在执行的任务。Java没有提供一种安全直接的方法来停止某个线程,但是Java提供了中断机制。
如果对Java中断没有一个全面的了解,可能会误以为被中断的线程将立马退出运行,但事实并非如此。中断机制是如何工作的?捕获或检测到中断后,是抛出InterruptedException还是重设中断状态以及在方法中吞掉中断状态会有什么后果?Thread.stop与中断相比又有哪些异同?什么情况下需要使用中断?本文将从以上几个方面进行描述。
...
- 2014-04-03 14:57
- 浏览 270
- 评论(0)
最近在看《深入剖析Tomcat》一书,同时,正在按照这本书内容开发一个自己的servlet容器。阅读过程中,发现的Tomcat的设计模式有:
1.单例模式。
Tomcat的容器分为Wrapper,Conetxt,Host,Engine四种。其中,Wrapper对应每一个Servlet的容器,Context则对应于应用程序的容器。因此,每一个Wrapper只能与一个Servlet相关联。因此,Wrapper使用了单例模式来保证Servlet实例的唯一性。
2.观察者模式
为了实现启动或关闭父容器即可启动或关闭组件以及子容器,Tomcat设计出一个生命周期接口Lifecycle。Contex ...
- 2014-03-20 15:29
- 浏览 374
- 评论(0)
1. Java堆中各代分布:
图1:Java堆中各代分布
Young:主要是用来存放新生的对象。
Old:主要存放应用程序中生命周期长的内存对象。
Permanent:是指内存的永久保存区域,主要存放Class和Meta的信息,Class在被 Load的时候被 ...
- 2014-02-28 16:55
- 浏览 653
- 评论(0)
一、运行时数据区域
线程隔离的数据区:虚拟机栈、本地方法栈、程序计数器。
所有线程共享的数据区:方法区、堆。
二、
2.1程序计数器
程序计数器是一块较小的内存空间,用来指示当前线程执行的字节码的行号,完成分支,循环,跳转的功能。
为什么会需要程序计数器作为线程隔离的内存区域而不是所有线程共用?因为Java虚拟机的多线程是通过切换时间片的方式来实现的,因此,在一个确定的时刻,一个处理器只会执行一条线程。因此,为了线程切换之后仍能够回到正确的字节码行号,必需每个线程有一个独立的程序计数器。
2.2Java虚拟机栈
Java虚拟机栈是线程私有的,它的生命周期与线程相。虚拟机栈描述的是 ...
- 2014-02-20 20:03
- 浏览 387
- 评论(0)
我们的项目中为socket通信服务的“心跳包”
在我们的考试系统中用到客户端和服务器之间的通信,服务器要时刻知道客户端的网络连接状态,当时我遇到这个问题的时候就没有在网上找到传说中的“心跳包”。只是凭自己心思随想写出了一个解决时下问题的算法。下面是客户端心跳包核心代码:
#region ++++++++++++++++++++客户端的感觉系统
//启动记时器
public void BeginTheTimer()
{
//th_UserLogin();
object myobject = (object)7; //这里只是要一个object类型数据,用它做为下面Ti ...
- 2014-02-01 18:15
- 浏览 645
- 评论(0)
首先,来看inverse和cacade的取值有哪些..
1. cascade 有五个选项 分别是: all ,delete ,none,save-update,delete-orphan ;
2. inverse 有两个值 true ,false
这几个值各是什么呢?
cascade的五个值:
all:所有情况下均进行关联操作,即save-update + delete.
none:所有情况下均不进行关联操作。这是默认值。
save-update:在执行save/update/saveOrUpdate时进行关联操作。
delete:在执行delete时进行关联操作。
del ...
- 2014-01-26 17:22
- 浏览 395
- 评论(0)
inverse为true时表示将主控权交给关联类来执行,在为false时表示由自己来行驶主控权。
inverse属性默认为false,也就是说关系的两端都维护关系。
在一对多映射中,inverse属性多设置为true,也就是说,一对多映射的映射关
系最好由多的一方来维护。
如下所示,为建立的Boy与Girl的关系一对多模型,一个Boy对应多个Girl。
Boy.java
package hibernate.persistance;
import java.sql.Date;
import java.util.HashSet;
import java.util.Set;
publ ...
- 2014-01-26 17:16
- 浏览 411
- 评论(0)
HashMap是Hashtable的非线程安全版。非常明显由源码可以看出,Hashtable与HashMap并不出于同一个人之手,代码风格有很大差别。
首先,Hashtable继承自Dictionary接口而不是Map接口,为什么呢?Dictionary接口其实与Map接口差不多,但是已经被废弃,被Map接口所取代。与HashMap相同,Hashtable也实现了java.lang.Cloneable接口与java.io.Serializable接口。
数据结构上,Hashtable与HashMap的结构是几乎一样的实现。
那么Hashtable在源码大体结构与HashMap相似的情况下, ...
- 2014-01-13 15:32
- 浏览 418
- 评论(0)
今天在看hashtable源码时看到clone()函数,官方文档说hashtable实现的是浅拷贝,但是,粗看之下,其的确对每一个Entry都调用了clone函数,怎么会是浅拷贝呢?
如下:
public synchronized Object clone() {
try {
Hashtable<K,V> t = (Hashtable ...
- 2014-01-13 10:50
- 浏览 473
- 评论(0)