深入理解Java虚拟机 - 泛型与类型擦除

泛型是JDK 1.5的一项新增特性,它的本质是参数化类型(Parametersized Type)的应用,也就是说所操作的数据类型被指定为一个参数。 这种参数类型可以用在类、 接口和方法的创建中,分别称为泛型类、 泛型接口和泛型方法。Java语言中的泛型只在程序源码中存在,在编译后的字节码文件中,就已经替换为原来的原生类型了,并且在相应的地方插入了强制转换代码,因此,对于运行期的Java语言来 …… 阅读全文

Java并发编程之内存模型

硬件的效率与一致性让计算机并发执行若干运算任务不可能只靠处理器“计算”就能完成,处理器至少要与内存交互,如读取运算数据、存储运算结果的哪个,由于计算机的存储设备与处理器的运算速度有几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(Cache)来作为内存与处理器之间的缓冲;将运算需要使用到的数据复制到缓存中,让运算能快速进行,当运算结束后再从缓存同步回内存 …… 阅读全文

Java并发编程之volatile

volatile可以说是Java虚拟机提供的最轻量级的同步机制,Java内存模型对volatile专门定义了一些特殊的访问规则。当一个变量定义为volatile之后,它将具备两种特性,第一是保证此变量对所有线程的可见性,这里的“可见性”是指当一条线程修改了这个变量的值,新值对于其他线程来说是可以立即得知的。 而普通变量不能做到这一点,普通变量的值在线程间传递均需要通过主内存来完成,例如,线程A修改一 …… 阅读全文

Java并发编程之final

final域的重排序规则对于final域,编译器和处理器要遵守两个重排序规则。在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。下面通过一些示例性的代码来分别说明这两个规则。public class FinalExample { …… 阅读全文

Java中split使用时遇到的问题

项目中是这样使用split()的// onestr 为 PRO:=:2018-01// 按 “:” 分隔为3部分String[] valueT = onestr.split(":"); 之前一直没事,直到日期值变为了 2018-01-31 11:14:55 就出现了问题,被分隔成了PRO=2018-01-31 111455这不是我要的结果,想要的是个完整的日期值... …… 阅读全文

Java之浅克隆和深克隆

克隆就是复制一个对象的副本,但一个对象中有可能有基本数据类型,如 int,long,float等,也可能含有对象引用数据类型,如 数组,集合等浅克隆:被复制对象的所有变量都含有与原来的对象相同的值,而所有的其他对象的引用仍然指向原来的对象。换言之,浅克隆仅仅复制所考虑的对象,而不复制它所引用的对象。深克隆:被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象 …… 阅读全文

Java使用阻塞队列BlockingQueue实现生产者消费者

什么是阻塞队列阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法。1、支持阻塞的插入方法:意思是当队列满时,队列会阻塞插入元素的线程,直到队列不满。2、支持阻塞的移除方法:意思是在队列为空时,获取元素的线程会等待队列变为非空。阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里取元素的线程。... …… 阅读全文

Servlet单实例多线程模式

问题:Servlet是线程安全的吗?Servlet类本质上也是一个普通的类,并且Servlet容器默认只允许单个实例存在。当请求到达服务器时,Servlet实例如果已经存在的话则直接加载该实例,如果该Servlet类还未实例化则会先初始化这个Servlet。当请求到达Web服务器时,Web服务器中有一个线程池,它会从线程池中取一个工作线程,通过该线程调用请求的Servlet。因此,对Serv …… 阅读全文