java
文章平均质量分 73
L970524
学生
展开
-
java泛型
1. 泛型的引出首先,提出看下下面的代码: package book.generic;import java.util.List;import org.junit.Test;import java.util.ArrayList;public class GenericDemo { public static void main(String[] args) { List l原创 2017-04-08 14:48:59 · 663 阅读 · 1 评论 -
Java 多线程三大核心
Java 多线程三大核心原子性Java 的原子性就和数据库事务的原子性差不多,一个操作中要么全部执行成功或者失败。JMM 只是保证了基本的原子性,但类似于 i++ 之类的操作,看似是原子操作,其实里面涉及到:获取 i 的值。自增。再赋值给 i。这三步操作,所以想要实现 i++ 这样的原子操作就需要用到 synchronized 或者是 lock 进行加锁处理。如...原创 2018-08-07 16:00:38 · 279 阅读 · 0 评论 -
Synchronized关键字
synchronized 关键字原理众所周知 synchronized 关键字是解决并发问题常用解决方案,有以下三种使用方式:同步普通方法,锁的是当前对象。同步静态方法,锁的是当前 Class 对象。同步块,锁的是 () 中的对象。实现原理: JVM 是通过进入、退出对象监视器( Monitor )来实现对方法、同步块的同步的。具体实现是在编译之后在同步方法调用前加入一个...原创 2018-08-07 15:53:57 · 190 阅读 · 0 评论 -
Java 多线程常见问题
Java 多线程常见问题上下文切换多线程并不一定是要在多核处理器才支持的,就算是单核也是可以支持多线程的。 CPU 通过给每个线程分配一定的时间片,由于时间非常短通常是几十毫秒,所以 CPU 可以不停的切换线程执行任务从而达到了多线程的效果。但是由于在线程切换的时候需要保存本次执行的信息,在该线程被 CPU 剥夺时间片后又再次运行恢复上次所保存的信息的过程就成为上下文切换。...原创 2018-08-07 11:49:59 · 204 阅读 · 0 评论 -
volatile关键字
volatile 关键字前言不管是在面试还是实际开发中 volatile 都是一个应该掌握的技能。首先来看看为什么会出现这个关键字。内存可见性由于 Java 内存模型(JMM)规定,所有的变量都存放在主内存中,而每个线程都有着自己的工作内存(高速缓存)。线程在工作时,需要将主内存中的数据拷贝到工作内存中。这样对数据的任何操作都是基于工作内存(效率提高),并且不能直接操作...原创 2018-08-07 11:30:42 · 153 阅读 · 0 评论 -
对象创建与内存分配
对象的创建与内存分配创建对象当 JVM 收到一个 new 指令时,会检查指令中的参数在常量池是否有这个符号的引用,还会检查该类是否已经被 加载过了,如果没有的话则要进行一次类加载。接着就是分配内存了,通常有两种方式:指针碰撞空闲列表使用指针碰撞的前提是堆内存是完全工整的,用过的内存和没用的内存各在一边每次分配的时候只需要将指针向空闲内存一方移动一段和内存大小相等区域即...原创 2018-08-07 09:21:03 · 256 阅读 · 0 评论 -
垃圾回收
垃圾回收 垃圾回收主要思考三件事情:哪种内存需要回收?什么时候回收?怎么回收?对象是否存活引用计数法这是一种非常简单易理解的回收算法。每当有一个地方引用一个对象的时候则在引用计数器上 +1,当失效的时候就 -1,无论什么时候计数器为 0 的时候则认为该对象死亡可以回收了。这种算法虽然简单高效,但是却无法解决循环引用的问题,因此 Java 虚拟机并没有采...原创 2018-08-07 01:14:57 · 315 阅读 · 0 评论 -
OOM(OutOfMemory)分析
OOM 分析Java 堆内存溢出在 Java 堆中只要不断的创建对象,并且 GC-Roots 到对象之间存在引用链,这样 JVM 就不会回收对象。只要将-Xms(最小堆),-Xmx(最大堆) 设置为一样禁止自动扩展堆内存。当使用一个 while(true) 循环来不断创建对象就会发生 OutOfMemory,还可以使用 -XX:+HeapDumpOutofMemoryErorr...原创 2018-08-07 00:35:55 · 333 阅读 · 0 评论 -
java类加载
一、java类加载机制 前几天在学习tomcat内核的时候,应用到了自定义加载类。其实这里是java的难点和重点。今天,我们就从java的类加载机制出发,从顶层到底层详细介绍类加载!1.1 类加载 几乎我看过的所有博客讲解这里是,都是以一段代码开始,这里我也就不例外了: 首先看下面的代码:public class Example { private stati原创 2017-11-05 14:40:49 · 453 阅读 · 0 评论 -
java运行时的内存划分
Java 运行时的内存划分程序计数器记录当前线程所执行的字节码行号,用于获取下一条执行的字节码。当多线程运行时,每个线程切换后需要知道上一次所运行的状态、位置。由此也可以看出程序计数器是每个线程私有的。虚拟机栈虚拟机栈由一个一个的栈帧组成,栈帧是在每一个方法调用时产生的。每一个栈帧由局部变量区、操作数栈等组成。每创建一个栈帧压栈,当一个方法执行完毕之后则出栈。...原创 2018-08-06 21:28:17 · 197 阅读 · 0 评论 -
HashMap的底层分析
更多 HashMap 与 ConcurrentHashMap 相关请查看这里。HashMap 底层分析 以下基于 JDK1.7 分析。如图所示,HashMap 底层是基于数组和链表实现的。其中有两个重要的参数:容量负载因子容量的默认大小是 16,负载因子是 0.75,当 HashMap 的 size > 16*0.75 时就会发生扩容(容量和负载因子都...原创 2018-08-01 11:01:16 · 251 阅读 · 0 评论 -
ArrayList/Vector的底层分析
ArrayList/Vector 的底层分析ArrayListArrayList 实现于 List、RandomAccess 接口。可以插入空数据,也支持随机访问。ArrayList相当于动态数据,其中最重要的两个属性分别是: elementData 数组,以及 size 大小。 在调用 add() 方法的时候: public boolean add(E e) {...原创 2018-08-01 10:07:58 · 515 阅读 · 0 评论 -
Spring Ioc基于java反射而远远高于反射---Spring框架三大核心接口
关于最基础的Ioc的概念及其思想,我们在Spring核心功能–Ioc一节中都有过详细的讨论,这里就不多言了!1、java反射 那么,接下来,我们从反射入手,开始Spring征程。看例子:package com.smart.reflect;public class Car { private String brand; private String原创 2017-11-16 08:44:13 · 1804 阅读 · 0 评论 -
Spring容器高级主题
1.1 Spring容器技术内幕 1.1.1 内部工作机制 spring的AbstractApplicationContext是ApplicationContext的抽象实现类,该抽象类的refresh()方法定义了Spring容器在加载配置文件后的各项处理过程,这些处理过程清晰地刻画了Spring容器启动时所执行的各项操作。看refresh()源码://初始化BeanFactory原创 2017-11-29 17:59:43 · 357 阅读 · 0 评论 -
TOMCAT内核之旅--连接器(Connector)--学习心得(三)
3.1 前言 首先我先针对上一小节最后出现的问题,作出回答,其实很简单,我们要加载一个类的实例,则不粗得到其字节码文件(class文件),eclipse是一个IDE工具,它具有自编译功能,src包下的目录为我们编写的java源文件,而其会自动生成bin包,其下拥有和src包下相同目录,但是其为对应的java文件编译后的字节码文件。 所以,上节课我们出现的异常问题就得以解释,我们原创 2017-11-04 11:59:46 · 766 阅读 · 0 评论 -
Spring--装配Bean
任何一个成功的应用都是有多个为了实现某一业务目标而相互协作的组件构成的。这些组件必须彼此了解,并且相互协作来完成工作。 上篇文章我们通过一个实例,说明了Spring的重要性。不使用Spring,创建应用之间关联关系的传统方法通常会导致结构严重复杂的代码,这些代码很难被复用也很难进行单元测试。然而在Spring中,对象无需查找或创建与其关联的其他对象。相反的,容器负责把需要相互协作的对象引用原创 2017-11-13 10:40:31 · 372 阅读 · 0 评论 -
理解Java Spring核心功能之一:控制反转容器(IOC Container)
控制反转空气(IOC Container)是Spring的一个重要基础功能,不喜欢新名词的同学,姑且理解为**组件装配容器**为什么需要Spring 容器 要理解Spring的设计精神,先来看看Spring的设计初衷。 先看没有Spring之前,我们怎么做? 以一个实际情况说明,大家都应该购买过手机。那么你肯定有这样的经历,收到手机,打开包装,原创 2017-11-10 20:00:28 · 891 阅读 · 1 评论 -
ReentrantLock 实现原理
ReentrantLock 实现原理使用 synchronized 来做同步处理时,锁的获取和释放都是隐式的,实现的原理是通过编译后加上不同的机器指令来实现。而 ReentrantLock 就是一个普通的类,它是基于 AQS(AbstractQueuedSynchronizer)来实现的。是一个重入锁:一个线程获得了锁之后仍然可以反复的加锁,不会出现自己阻塞自己的情况。 AQS...原创 2018-08-07 17:27:01 · 224 阅读 · 0 评论