Java
文章平均质量分 79
小弟季义钦
好东西要大家分享!
展开
-
Java并发:主线程等待多个子线程执行完才继续执行
主线程等待多个子线程执行完才继续执行,以下是我能想到的几种方法,欢迎讨论、指正。1.闭锁CountDownLatch闭锁是典型的等待事件发生的同步工具类,将闭锁的初始值设置为与子线程数目相同,每个子线程执行完成都调用CountDown()方法,主线程调用await()方法等待计数值变为零之后恢复继续执行。 2.线程间同步方法假设有N个子线程,每个子线程执行完成都将一个全局的原子变量加1,待某个线程原创 2016-04-24 22:11:09 · 16463 阅读 · 2 评论 -
Java IO:阻塞/非阻塞式IO、同步/异步IO
转载请注明出处:jiq•钦's technical Blog 本文主要内容转自这篇文章,并在此基础上理解后总结。引言同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous IO和non-blo转载 2015-07-06 22:58:04 · 3583 阅读 · 0 评论 -
Java基础:String不可变性和final修饰
String的不可变性Java规定String是不可变的(immutable),其实这个不可变具备两层含义:1 内容不可变任何看起来修改它们的操作,实际上都是重新new出一个对象。String s = new String("111");String newS = s;newS = "dsfsd";System.out.println(s); //111如果不能做到内容不可变,在两个引用同原创 2016-04-07 00:39:00 · 5110 阅读 · 0 评论 -
Java基础:运行时异常和非运行时异常
1.Java异常机制Java把异常当做对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。Java中的异常分为两大类:错误Error和异常Exception,Java异常体系结构如下图所示:2.ThrowableThrowable类是所有异常或错误的超类,它有两个子类:Error和Exception,分别表示错误和异常。其中异常Exception分为运行时异常(Ru转载 2016-04-10 01:24:56 · 6184 阅读 · 0 评论 -
JVM:类加载器之双亲委派模型
虚拟机中加载类需要经历“加载、验证、准备、解析和初始化”五个阶段。其中加载阶段是“通过一个类的全限定名来获取描述此类的二进制字节流”,实现这个动作的代码模块称为“类加载器”。(一)三种系统提供的类加载器JVM类加载器分为两类,一类是启动类加载器BootStrap ClassLoader,由C++语言实现,是JVM的一部分,一类是其他类加载器,由Java语言实现,独立于虚拟机外部,并且都继承自抽象类原创 2016-04-25 23:41:18 · 6933 阅读 · 0 评论 -
Java并发:线程安全的单例模式
转载请注明出处:jiq•钦'stechnical Blog1、饿汉式public class Singleton { private final static Singleton INSTANCE = new Singleton(); private Singleton() { } public static Singleton getInstance() { return INST原创 2016-03-26 22:40:36 · 1411 阅读 · 0 评论 -
Java基础:数组
转载请注明出处:jiq•钦's technical Blog 一、数组初始化无论如何,当你要实例化一个数组对象的时候,必须要指定其大小。不能在提供了initializer的情况下再去指定数组的维度!!! 正确的初始化方式有:方式1:Int[][] array =new int[][]{{1,2},{3,4},{5},{2,4,2,1}}; 方式2:Int[][原创 2015-06-29 22:36:59 · 1438 阅读 · 0 评论 -
Java容器:HashMap和HashSet解析
转载请注明出处:jiq•钦's technical Blog 一、HashMapHashMap,基于散列(哈希表)存储“Key-Value”对象引用的数据结构。存入的键必须具备两个关键函数:(1)equals(): 判断两个Key是否相同,用来保证存入的Key的唯一性;(2)hashCode(): 根据k-v对象的Key来计算其引用在散列表中存放的位置; HashMap底层结构是一个数组:tra原创 2015-07-02 00:17:10 · 2233 阅读 · 0 评论 -
Java并发:volatile内存可见性和指令重排
转载请注明出处:jiq•钦'stechnical Blogvolatile两大作用1、保证内存可见性2、防止指令重排 此外需注意volatile并不保证操作的原子性。内存可见性1 概念 JVM内存模型:主内存和线程独立的工作内存Java内存模型规定,对于多个线程共享的变量,存储在主内存当中,每个线程都有自己独立的工作内存(比如CPU的寄存器),线程只能访问自己的工作内存,不可以访问原创 2016-03-26 22:34:56 · 15874 阅读 · 5 评论 -
JVM:JVM深入学习
备注:本文转自cutesource的博客一、基本结构从Java平台的逻辑结构上来看,我们可以从下图来了解JVM:从上图能清晰看到Java平台包含的各个逻辑模块,也能了解到JDK与JRE的区别对于JVM自身的物理结构,我们可以从下图鸟瞰一下:对于JVM的学习,在我看来这么几个部分最重要:Java代码编译和执行的整个过程JVM内存管理及垃圾回收机制下面将这两个部分进行详细学习二、Java代码编译和执行转载 2016-02-28 00:31:28 · 1360 阅读 · 0 评论 -
JVM:浅析Java虚拟机结构与机制
转自: 舒の随想日记本文旨在给所有希望了解JVM(Java Virtual Machine)的同学一个概念性的入门,主要介绍了JVM的组成部分以及它们内部工作的机制和原理。当然本文只是一个简单的入门,不会涉及过多繁杂的参数和配置,感兴趣的同学可以做更深入的研究,在研究JVM的过程中会发现,其实JVM本身就是一个计算机体系结构,很多原理和我们平时的硬件、微机原理、操作系统都有十分相似的地方,所以学习转载 2016-02-27 23:58:50 · 1001 阅读 · 0 评论 -
Java IO:SocketChannel和Selector在ZooKeeper中应用
转载请注明出处:jiq•钦's technical Blog 如果不了解SocketChannel和Selector,请先阅读我的另一篇博文:http://blog.csdn.net/jiyiqinlovexx/article/details/46780555 ZooKeeper的启动从QuorumPeerMain类的main函数开始: 调用顺序是: Main -> initializeAndRu原创 2016-01-20 22:57:03 · 1918 阅读 · 0 评论 -
设计模式类图概览
把常见的设计模式类图放在这里,方便查阅!!!转载 2016-04-06 00:26:46 · 3577 阅读 · 0 评论 -
Java7新特性一览
转自:点击这里官方:点击这里Swing新增 JLayer 类,是一个灵活而且功能强大的Swing组件修饰器,使用方法:How to Decorate Components with JLayer.Nimbus Look and Feel 外观从 com.sun.java.swing 包移到 javax.swing 包中,详情:javax.swing.plaf.nimbus更轻松的重量级和轻量级组件转载 2016-04-04 23:48:28 · 2621 阅读 · 0 评论 -
JVM:class加载时机及两种显示加载的区别
从下面代码可以看出来几点:1、 class文件的加载的时机显示加载: 调用ClassLoader.loadClass(className)与Class.forName(className)隐式加载: 创建类对象 使用类的静态域 创建子类对象 使用子类的静态域 2、 两种显示加载class文件到JVM的区别Class.f原创 2016-04-08 00:04:01 · 6525 阅读 · 1 评论 -
JVM:垃圾回收机制和调优手段
我们都知道JVM内存由几个部分组成:堆、方法区、栈、程序计数器、本地方法栈JVM垃圾回收仅仅针对公共内存区域即:堆和方法区进行。本文主要讨论两点,一是垃圾回收策略,二是调优的方法。一、垃圾回收机制1.1 分代管理将堆和方法区按照对象不同年龄进行分代:u 堆中会频繁创建对象,基于一种分代的思想,按照对象存活时间将堆划分为新生代和旧生代两部分,我们不能一次垃圾回收新生代存活的对象就放入旧生代,而是要原创 2016-04-15 00:14:30 · 12794 阅读 · 3 评论 -
Java并发:线程间同步机制:条件队列和同步工具类
线程之间的同步,除了互斥(前面介绍的互斥锁)之外,还存在协作关系,下面我们就介绍一下java线程间常见的一些协作方式。一、内置条件队列正如每个Java对象都可以作为一个内置锁,每个对象也可以作为一个条件队列,称为内置条件队列,Object.wait()、notify()/notifyAll()构成了内置条件队列的API。需要注意的是,调用任何对象X的内置条件队列的API都必须要先获得该对象X的内置原创 2016-04-03 15:34:32 · 2208 阅读 · 0 评论 -
Java并发:等待事件发生后所有线程继续执行
等待某一个指定的事件发生后,才让多个等待的线程继续执行,以下是我能想到的几个方法,欢迎讨论、指正。1.闭锁CountDownLatch闭锁是典型的等待事件发生的同步工具类,将闭锁的初始值设置1,所有线程调用await方法等待,当事件发生时调用countDown将闭锁值减为0,则所有await等待闭锁的线程得以继续执行。 2.阻塞队列BlockingQueue所有等待事件的线程尝试从空的阻塞队列获取原创 2016-04-24 22:09:39 · 9891 阅读 · 0 评论 -
Java IO:BIO和NIO区别及各自应用场景
引言BIO:同步阻塞式IO,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。NIO:同步非阻塞式IO,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。下面通过一个例子解释两者区别:假设当前服务原创 2016-04-20 22:57:29 · 18114 阅读 · 0 评论 -
JVM:内存监视手段及各区域内存溢出解决
引言本文仅关注一些常见的虚拟机内存监视手段,以及JVM运行时数据区各个部分内存溢出的发生和对应的解决方案,总体来说属于概括性总结,涉及相对不是很深入,目的是让自己和其它初学者有一个框架性、概念性的了解,当遇到问题时有迹可循、不至于不知所措。一、虚拟机内存监视手段虚拟机常出现的问题包括:内存泄露、内存溢出、频繁GC导致性能下降等,导致这些问题的原因可以通过下面虚拟机内存监视手段来进行分析,具体实施时原创 2016-04-17 02:36:53 · 15811 阅读 · 2 评论 -
Java IO:面向缓冲区、同步、非阻塞式IO(NIO)
转载请注明出处:jiq•钦's technical Blog 引言JDK1.4中引入了NIO,即New IO,目的在于提高IO速度。特别注意JavaNIO不完全是非阻塞式IO(No-Blocking IO),因为其中部分通道(如FileChannel)只能运行在阻塞模式下,而其他的通道可以在阻塞式和非阻塞式之间进行选择。尽管这样,我们还是习惯将Java NIO看作是非阻塞式IO,而前面介绍的面向流原创 2015-07-06 23:16:38 · 4414 阅读 · 0 评论 -
Java IO:面向流、同步、阻塞式IO(BIO)
转载请注明出处:jiq•钦's technical Blog 备注:阅读此文之前,建议先看我这篇博文了解阻塞式IO和非阻塞式IO的基本概念。一、流(Stream)1、字节流输入(InputStream) 介质流 FileInputStream 从文件中读取信息 PipedInputStream 产生用于写入相关PipedOutputStream的数据,实现“管道化”概念原创 2015-07-06 23:06:28 · 2474 阅读 · 0 评论 -
Java并发:如何编写线程安全的代码
转载请注明出处:jiq•钦'stechnical Blog一切线程安全问题都是源自于不正确的共享数据导致。方式一:编写可重入代码编写可重入代码,即编写那些压根不会共享数据的代码。编写可重入代码包括借助线程本地存储这一特性:线程本地存储* 是一种自动化机制,可以为使用同一个变量的所有线程都创建一个各自不同的存储。 * 最主要的是,他可以使得你将状态与线程关联起来。private static Thr原创 2016-03-27 02:24:08 · 1442 阅读 · 0 评论 -
UML类图符号解释
在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregation),组合(Composition),依赖(Dependency) 1. 泛化(Generalization) 【泛化关系】:是一种继承关系,表示一般与特殊的关系,它指定了子类如何特化父类的所有特征转载 2016-04-06 00:31:23 · 3503 阅读 · 0 评论 -
Java并发:多线程和java.util.concurrent并发包总结
引言前面已经针对Java多线程框架中具体的点介绍了很多了,现在是需要一个概括性总结的时候了,正好从网上找到一张描述java.util.concurrent包组成结构的类图,正好可以对java多线程有一个概览性总结。以下图片转自:这里原创 2016-04-17 22:13:08 · 12069 阅读 · 0 评论 -
Java并发:可重入与线程安全
转载请注明出处:jiq•钦'stechnical Blog1函数的可重入性:函数可重入,意味着该函数可以同时由多个任务调用,而不会产生任何错误。可重入的函数不需要考虑线程安全问题,因为其不会引用任何共享数据。 可重入函数需满足几个条件:1、不能含有静态(全局)非常量数据2、不能返回静态(全局)非常量数据的地址。 3、只能处理由调用者提供的数据。4、不能依赖于单实例模式资源的锁。 5、不能调用不可重原创 2016-03-27 02:27:43 · 1494 阅读 · 0 评论 -
Java并发:终止线程和关闭线程池
一、任务的取消1.1标志位class ThreadOne implements Runnable{ public volatile boolean isComplete = false; @Override public void run() { while(!isComplete) { } } }这种方原创 2016-03-29 00:09:18 · 34985 阅读 · 2 评论 -
Java容器:容器一览
转载请注明出处:jiq•钦's technical Blog 一、Collection:存放独立元素Collection中的接口都是可选操作,其实现类 并不一定实现了其所有接口,这是为了防止“接口爆炸”。最常见的Unsupported Operation都源自于背后由固定尺寸的数据结构支持的容器,比如使用ArrayList.asList将数组转换成L原创 2015-06-30 00:27:18 · 2508 阅读 · 6 评论 -
Java并发:三种线程抽象以及线程执行
在Java 5之后,任务分两类:一类是实现了Runnable接口的类,一类是实现了Callable接口的类。两者都可以被ExecutorService执行,但是Runnable任务没有返回值,而Callable任务有返回值。此外还有一个FutureTask任务类型以拓展Runnable和Callable。一、Runnable任务抽象考虑一个处理客户端请求的服务器程序:1.1 Thread方式通常我原创 2016-03-27 18:15:58 · 1908 阅读 · 0 评论 -
Java并发:线程安全的容器:同步和并发
转载请注明出处:1. 引言多线程环境正确发布共享数据的方法之一就是线程安全容器。线程安全的容器是由锁保护的域,将数据放入线程安全的容器中,可以保障其被安全地发布给所有从这个容器访问它的线程。2. 同步容器类JDK1.0开始有两个很老的同步容器类:Vector和HashTable。JDK1.2之后Collections工具类中添加了一些工厂方法返回类似的同步封装器类:public static C原创 2016-03-31 22:20:00 · 4001 阅读 · 0 评论 -
Java并发:原子变量和非阻塞同步机制
一、互斥锁互斥锁虽然能够保障内存可见性和原子性,保障共享数据的安全访问,但是作为一种较为粗暴的同步机制,有很多缺点:1. 悲观锁:每次拿数据都会先加锁,降低代码并发度。2. 上下文切换开销大:线程的挂起和恢复需要很大的开销,并且存在较长时间的中断3. 优先级反转:当一个线程在等待一个锁时不能做其他事情,如果持有锁的线程被延迟执行,如发生缺页错误,调度延迟等,那么将导致原创 2016-04-04 21:59:21 · 3068 阅读 · 0 评论 -
Java并发:await/wait 与sleep、yield间的区别
(1)是否释放锁:调用sleep和yield的时候不释放当前线程所获得的锁,但是调用await/wait的时候却释放了其获取的锁并阻塞等待。 (2)调用后何时恢复:u sleep让线程阻塞,且在指定的时间之内都不会执行,时间到了之后恢复到就绪状态,也不一定被立即调度执行;u yield只是让当前对象回到就绪状态,还是有可能马上被再次被调用执行。u await/wait,它会一直阻塞在条件队列原创 2016-04-03 22:48:29 · 22711 阅读 · 0 评论 -
Java基础:抽象类和接口
一、引言基于面向对象五大原则中的下面两个原则,我们应该多考虑使用接口和抽象类:里氏替换原则:子类可以通过实现父类接口来替换父类,所以父类应尽可能实现为接口/抽象类,方便拓展程序而不影响现有代码。依赖倒置原则:和结构化设计不同,我们要让底层依赖于高层,而不是相反。而设计接口和抽象类时尽量遵循面向对象五大原则中的“接口隔离原则”,即使用专门接口比使用单一接口好。这个准则和针对类原创 2015-06-22 23:54:26 · 1225 阅读 · 0 评论 -
Java基础:异常捕获顺序
public voidtestException(){int a[] = {1,2,3};int q = 0;try{for(int i=0;i<a.length;i++){a[i] /= q;}}catch(ArithmeticException h){System.out.print("ArithmeticException\n"); //执行}catch(Excep原创 2015-06-22 23:55:57 · 2911 阅读 · 0 评论 -
Java开源知识库:XWiki安装(Windows平台)
准备安装XWiki,看了一下有三种安装方式:XWiki is a Java-based wiki and runs on a Servlet Container such as Tomcat, Jetty, JBoss, WebLogic, WebSphere, etc. It also uses a relational database to store its content.原创 2013-12-09 10:56:04 · 5560 阅读 · 0 评论 -
Java无限执行的线程启动与终止
需要开启一个线程,这个线程一直阻塞等待某件事情发生,最后根据主线程原创 2014-04-08 21:42:55 · 2886 阅读 · 0 评论 -
Eclipse中配置的Tomcat无法访问
在Eclipse的server中add了tomcate的服务器,选择的是E盘下面解压的一个tomcat 7,但是启动之后发现转载 2014-04-13 21:13:15 · 1102 阅读 · 0 评论 -
Java参数重载带来的疑惑
package someTest;class SSSuperClass{}class SSSubClass extends SSSuperClass{}public class TestDuplicate { public void function(Object o){ //方法1 System.out.print("Object\n"); }原创 2012-11-04 19:37:24 · 799 阅读 · 0 评论 -
Java测试内部类和嵌套类位置的合法性
/** * */package innerClass;/** * 结论: * 静态环境中不能引用非静态域。 * 静态方法/嵌套类只能声明在静态的或者顶层结构中 * 非静态方法/内部类可以放置在任何位置,任何一层 * */public class InnerClassAccess { private float f = 1.0f; //非静态字段原创 2012-11-03 12:49:20 · 830 阅读 · 0 评论 -
Java网络通信套接字
(一)第一个例子是简单的Socket通信,一个客户端和一个服务器线程:/** * SimpleClient.java */package network;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.原创 2012-11-01 10:27:44 · 868 阅读 · 0 评论