javaSE
文章平均质量分 50
碰碰猪
华中科技大学自动化研究生
展开
-
java中的构造问题
面对含有多态的子类的构造,实例的构造顺序如下:1.在其他任何事物发生前,将分配给对象的存储空间初始化成二进制的零。2.构造时,先构造父类,同时如果父类调用了子类拥有的多态方法,那么将调用子类的多态方法。此时子类空间全部为零,可能会产生意料之外的值!!3.回到子类,按照声明顺序调用成员的初始化方法。具体可以参考下面的例子:public class A { void say(){原创 2016-12-10 14:33:36 · 207 阅读 · 0 评论 -
Java源码剖析之Vector
之前我们已经学习了ArrayList的源码,ArrayList内置使用数组来储存数据。Vector数据结构和ArrayList很相似,也是使用数组存储。下面我们主要通过Vector与ArrayList对比来剖析Vector。 1.Vector比ArrayList多一个动态数组的增长系数capacityIncrement。在Vector的内置数组需要增加容量时,每次会根据增长系数大原创 2017-03-27 13:35:57 · 230 阅读 · 0 评论 -
Java源码剖析之Stack
栈(stack)是我们常用的基本数据结构之一,下面将简单剖析Java中stack 的数据结构。1.类定义publicclass Stack extends Vector { stack是继承与Vector的,也就是说,它是一个list实现。同时,继承了Vector的线程安全(效率较低~)。内部是数组实现(通过增长系数来扩容,增长系数为0时翻倍扩容)。2.构造方法。原创 2017-03-27 13:56:27 · 188 阅读 · 0 评论 -
Java多线程中Synchronized的实现原理与优化
一.Synchronized的实现原理 在Java中,每个对象有一个监视器monitor,当monitor被占用时就会处于锁定状态,线程执行monitorenter指令时会尝试获取monitor的所有权,过程如下: 1.如果monitor的进入数 entry count为0,则该线程成功进入monitor,然后将 entry count 设为1,该线程即为monitor的拥有者原创 2017-06-22 10:49:41 · 326 阅读 · 0 评论 -
Java多线程中join方法的实现
方法join的作用是使所属的线程对象t正常执行run()方法中的任务,而使当前线程z进行阻塞,等待t销毁后再继续执行z后面的代码。下面贴出join方法的源码: public final synchronized void join(long millis) throws InterruptedException { long base = System.cur原创 2017-06-20 15:31:57 · 346 阅读 · 0 评论 -
Java多线程中实现原子操作的方法
在Java中可以通过锁和循环CAS操作的方式来实现原子操作。一,使用循环CAS实现原子操作 JVM中的CAS操作是利用了处理器提供的 CMPXCHG 指令实现的。自旋CAS实现的基本思路就是循环进行CAS操作,直到成功为止。CAS是Compare And Swap的缩写,其操作需要输入两个值,一个旧值,一个新值,在操作期间比较旧值有没有发生改变,如果没发生,才交换成新值,发生了变化则原创 2017-06-23 10:59:04 · 880 阅读 · 0 评论 -
Java内存模型的几个关键词
Java内存屏障:为了保证内存的可见性,Java编译器在生成指令序列的适当位置会插入内存屏障指令来禁止特定类型的处理器重排序。Java内存模型把内存屏障指令分为四类如下: 1)LoadLoad Barriers :确保Load1数据的装载先于Load2及所有后续转载指令的装载。 2)StoreStore Barriers:确保Store1数据对其他处理器可见先于Store2及所原创 2017-06-23 19:37:58 · 248 阅读 · 0 评论 -
Java中的volatile关键字
当变量声明为volatile后,这个变量仿佛就具有了同步的特性,那么,volatile和正真的同步有什么区别呢?什么情况下,使用volatile可以代替Synchronized呢?下面我将同大家一起学习volatile关键字。 一,volatile特性 对volatile变量的单个读/写,可以看成为使用同一个锁,对普通变量的单个读操作函数和写操作函数进行加锁(不能是I++这种操作原创 2017-06-23 20:43:53 · 237 阅读 · 0 评论 -
Java多线程中线程的几种状态
Java线程在运行的生命周期中可能处于6种状态,每个确定时刻,线程只可能处于一种状态,6种状态如下:1)NEW:初始状态,线程被构建,但是还没有执行start()方法。2)RUNNABLE:运行状态,Java线程将操作系统中的就绪和运行两种状态统称为“运行中”。3)BLOCKED:阻塞状态,表示线程阻塞于锁。4)WAITING:等待状态,需要其他线程唤醒或者做出一些特性动作(通知或原创 2017-06-24 10:37:54 · 421 阅读 · 0 评论 -
Java多线程中Synchronized和Lock的区别
之前已经介绍过了Synchronized锁的实现原理,简单概括就是在JVM层运用了object的monitor来实现同步。而Lock是Java大神 Doug Lea 开发的util.concurrent中的一个锁工具,它实现了Synchronized的所有功能。下面从使用、性能这两个部分来具体分析两者的不同。一.Synchronized和Lock的用法区别Synchronized:在需要同原创 2017-06-25 12:00:38 · 1056 阅读 · 0 评论 -
Java多线程中Lock的实现
在Java 1.5之后,并发包中新增了Lock接口用来实现锁功能,它提供了Synchronized关键字类似的功能,只是在使用时需要显式地获取锁和释放锁。虽然它缺少了隐式获取锁释放锁的便捷性,但是却拥有了锁释放和获取的可操作性、可中断地获取锁以及超时获取锁等多种选择。1 Lock接口Lock接口的主要api如下:1)void lock():获取锁,调用该方法的当前线程或获取锁,并从该方原创 2017-06-25 16:08:15 · 370 阅读 · 0 评论 -
Java并发容器ConcurrentHashMap原理及HashMap死循环原因的分析
HashMap是我们最常用的数据结构之一,它方便高效,但遗憾的是,HashMap是线程不安全的,在并发环境下,在HashMap的扩容过程中,可能造成散列表的循环锁死。而线程安全的HashTable使用了大量Synchronized锁,导致了效率非常低下。幸运的是,并发编程大师Doug Lea为我们提供了ConcurrentHashMap,它是线程安全版的HashMap。这篇文章将为大家简单分析一下原创 2017-06-26 10:56:44 · 4421 阅读 · 0 评论 -
Java并发容器之阻塞队列简介
阻塞队列(BlockingQueue)是支持两个附加操作的队列,这两个操作支持阻塞的插入和移除方法。 1)支持阻塞的插入方法,当队列满时,队列会阻塞插入元素的线程,直到队列不满。 2)支持阻塞的移除方式,当队列为空时,获取元素的线程会等待直到队列不为空。 几种插入、移除方法比较: 插入方法: 1)add(e):将指定的元素插入到此队列的尾部(如果立原创 2017-06-28 09:51:24 · 229 阅读 · 0 评论 -
Java源码剖析之ArrayList
ArrayList是我们最常用的链表之一,经常作为动态数组使用,今天我们将对ArrayList源码一探究竟。 1.Class定义public class ArrayList extends AbstractList implements List, RandomAccess, Cloneable, java.io.Serializable AbstractL原创 2017-03-25 14:46:54 · 309 阅读 · 0 评论 -
java中的final含义
final关键字的含义是恒定不变的。具体有两个含义:1.对于基本数据类型,表示永不改变的编译时常量。2.对于普通对象,表示该引用恒定不变,不能指向另外一个对象,但是该对象本身是可以进行修改的。因此有以下几个注意点:1.在类中的 static final 属性,表示占据一段不能改变的存储空间,必须在声明中初始化,在构造中不能初始化。2.类中的 final 属性,因为不是s原创 2016-12-10 09:50:33 · 2508 阅读 · 0 评论 -
JSON的解析
JSON的语法:1.数据在键值对中2.数据间使用逗号分离3.花括号保存对象JSON的值:1.数字 “int”:1,2.字符串(使用双引号 "str":"zzp",3逻辑值 (true或者false)3.数组(方括号 "tags": [ { "id": "13", "原创 2017-01-11 21:53:53 · 398 阅读 · 0 评论 -
腾讯云服务器中的80端口占用问题
今天第一次使用了腾讯云服务器部署tomcat,在将tomcat默认的8080端口改为80端口时,遇到了端口被占用的情况。解决过程如下: 1.打开cmd,输入 netstat -ano|findstr "80" ,发现端口被PID=4的进程占用。 2.打开任务管理器,查看PID=4是一个system进程,其对应的进程描述是NT kernel & system。原创 2017-01-12 17:13:31 · 7675 阅读 · 1 评论 -
Java源码剖析之HashSet
上一篇文章我们介绍了HashMap的实现,现在我们学校HashSet就很容易啦。这里提一点的是,HashMap并不是Collection接口的实现类,它只是Map1.构造方法 public HashSet() { map = new HashMap<>(); } public HashSet(Collection<? extends E> c) { m原创 2017-03-28 09:37:17 · 204 阅读 · 0 评论 -
Java源码剖析之HashMap
键值对(也就是Map)是我们经常使用的一种数据结构,其中HashMap应该是我们使用最多的一种,因为它速度快,没有别的特殊需求一般我们都会使用HashMap。下面我们对它的源码进行剖析。1.单位存储对象EntryHashMap中,一个键值对使用一个Entry static class Entry<K,V> implements Map.Entry<K,V> { final K原创 2017-03-28 09:43:31 · 428 阅读 · 0 评论 -
Java源码剖析之fail-fast机制
fail-fast机制是Java集合的一种错误机制。当多个线程对同一个集合进行操作时,可能就会产生fail-fast事件。比如当我们使用iterator去遍历集合的同时另一线程对该集合进行操作,就有可能抛出 java.util.ConcurrentModificationException异常,产生fail-fast事件。1.fail-fast原理我们通过ArrayList中的iterator源码剖原创 2017-03-28 09:45:36 · 308 阅读 · 0 评论 -
Java源码剖析之LinkedList
LinkedLists 是我们最常用的集合之一,通过节点Node来储存元素。下面我们来剖析LinkedList源码。 我们先来查看LinkedList的基本存储单元Node: private static class Node<E> { E item; Node<E> next; Node<E> prev; Node(Nod原创 2017-03-28 09:50:53 · 256 阅读 · 0 评论 -
java的整型直接的转换
看一段小程序:public static void main(String[] args) { byte b = -10; char c = (char)b; int i = c; System.out.println(i); }输出的结果是65526,这里做一下解释:1.byte=-10时,补码为 1111 01102.转为int型,因为byte是有符号型原创 2017-03-11 19:51:33 · 268 阅读 · 0 评论 -
Java的++i与i++
先看一小段代码:public static void main(String[] args) { int i=1; i=i++; System.out.println(i); }可能很多人认为结果是‘2’,因为I先赋值给自身,然后又进行了增1.上述结论是错的!实际上,不管是前置++I,还是后置I++,都是先将变量的值加1,然后再继续计算的。两者真正的区别是:前置原创 2017-03-12 10:01:04 · 218 阅读 · 0 评论 -
Java源码剖析之输入输出流
Java里的管道输入流PipedInputStream与管道输出流PipedOutputStream实现了类似管道的功能,用于不同线程之间的相互通信,下面说下自己的一些理解。1.连接方法。输入输出流是配套使用的,一个输出流必须与一个输入流配合才能工作。在Java的实现中,输入输出流的连接方式是:输出流中包含了输入流: private PipedInputStream sink;原创 2017-03-28 21:40:31 · 377 阅读 · 0 评论 -
Java源码剖析之IO序列化
java基本类型和许多常用库类都实现了Serializable接口,该接口允许我们对实现了其接口的类进行序列化操作,也就是保存对象的状态。我们在下面几种情况经常会使用到序列化:(1)把一个对象状态保存到文件中(2)使用套接字传送对象时(3)通过RMI传送对象时下面,我们对序列化进行简单介绍。1.基本类型和实现了Serializable接口的类都允许进行序列化2.st原创 2017-03-29 21:51:34 · 190 阅读 · 0 评论 -
Class.forName()的作用
我们在加载数据库驱动的时候,一般会调用Class.forName("com.mysql.jdbc.Driver"); 它的作用其实是获得数据库驱动的Class对象。定义:Class.forName:返回与给定的字符串名称相关联类或接口的Class对象。Class.forName是一个静态方法,同样可以用来加载类。该方法有两种形式:Class.forName(String原创 2017-08-24 21:52:17 · 4815 阅读 · 0 评论