JAVA基础知识
了解一些底层实现的东东
大神,快来碗里
专注于Java相关技术
展开
-
深入理解(15)java多线程之Lock对象实现同步以及线程间通信
Lock对象简介这里为什么说Lock对象哪?Lock其实是一个接口,在JDK1.5以后开始提供,其实现类常用的有ReentrantLock,这里所说的Lock对象即是只Lock接口的实现类,为了方便记忆或理解,都简称为Lock对象。我们知道synchronized关键字可以实现线程间的同步互斥,从JDK1.5开始新增的ReentrantLock类能够达到同样的效果,并且在此基础上还扩展了很多实...原创 2019-05-01 22:45:15 · 10808 阅读 · 0 评论 -
深入理解(14)java多线程之线程计数器CountDownLatch和循环屏障CyclicBarrier
倒计时CountDownLatchCountDownLatch是一个非常实用的多线程控制工具类,称之为“倒计时器”,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。举了例子:我们知道的集齐七颗龙珠就可以召唤神龙,那我们就一起召唤一下,下边我需要派7个人(7个线程)去分别去找这7颗不同的龙珠,每个人找到之后回来告诉我还需要等待的龙珠个数减1个,那么当全部的人都找到龙珠之后,那么...原创 2019-05-01 22:40:09 · 10617 阅读 · 0 评论 -
深入理解(13)java多线程之Callable、Future和FutureTask浅析
原文:https://blog.youkuaiyun.com/javazejian/article/details/50896505我们知道创建线程的方式有两种,一种是实现Runnable接口,另一种是继承Thread,但是这两种方式都有个缺点,那就是在任务执行完成之后无法获取返回结果,那如果我们想要获取返回结果该如何实现呢?还记上一篇Executor框架结构中提到的Callable接口和Future接...原创 2019-05-01 22:31:51 · 10613 阅读 · 0 评论 -
深入理解(12)java多线程之Executor框架之ThreadPoolExcutor&ScheduledThreadPoolExecutor浅析
原文:https://blog.youkuaiyun.com/javazejian/article/details/50890554无论是在java还是在android中其实使用到的线程池都基本是一样的,因此本篇我们将来认识一下线程池Executor框架(相关知识点结合了并发编程艺术书以及Android开发艺术探索而总结),下面是本篇的主要知识点:1.Executor框架浅析首先我们得明白一个 问...原创 2019-05-01 22:20:55 · 10748 阅读 · 0 评论 -
深入理解(11)java多线程之ThreadLocal原理
深入理解(1)Java注解类型(@Annotation) 深入理解(2)Java枚举类型(enum)深入理解(3)Java类加载器(ClassLoader)深入理解(4)Java类型信息(Class对象)与反射机制深入理解(5)Java内存模型(JMM)及volatile关键字深入理解(6)Java并发AQS的共享锁的实现(基于信号量Semaphore)深入理解(7)Java无锁C...原创 2019-05-01 21:56:29 · 15468 阅读 · 0 评论 -
深入理解(10)java并发之阻塞队列LinkedBlockingQueue与ArrayBlockingQueue
原文:https://blog.youkuaiyun.com/javazejian/article/details/72772461阻塞队列概要阻塞队列与我们平常接触的普通队列(LinkedList或ArrayList等)的最大不同点,在于阻塞队列支出阻塞添加和阻塞删除方法。阻塞添加所谓的阻塞添加是指当阻塞队列元素已满时,队列会阻塞加入元素的线程,直队列元素不满时才重新唤醒线程执行元素加入操作。...原创 2019-05-01 10:40:28 · 16572 阅读 · 0 评论 -
深入理解(9)Java基于并发AQS的(独占锁)重入锁(ReetrantLock)及其Condition实现原理
原文:https://blog.youkuaiyun.com/javazejian/article/details/72772461Lock接口前面我们详谈过解决多线程同步问题的关键字synchronized,synchronized属于隐式锁,即锁的持有与释放都是隐式的,我们无需干预,而本篇我们要讲解的是显式锁,即锁的持有和释放都必须由我们手动编写。在Java 1.5中,官方在concurrent并...原创 2019-05-01 10:39:14 · 16670 阅读 · 2 评论 -
深入理解(8)Java并发之synchronized实现原理
原文:https://blog.youkuaiyun.com/javazejian/article/details/72772461线程安全是并发编程中的重要关注点,应该注意到的是,造成线程安全问题的主要诱因有两点,一是存在共享数据(也称临界资源),二是存在多条线程共同操作共享数据。因此为了解决这个问题,我们可能需要这样一个方案,当存在多个线程操作共享数据时,需要保证同一时刻有且只有一个线程在操作共享数...原创 2019-05-01 10:38:07 · 17099 阅读 · 0 评论 -
深入理解(7)Java无锁CAS与Unsafe类及其并发包Atomic
原文:https://blog.youkuaiyun.com/javazejian/article/details/72772461无锁的概念在谈论无锁概念时,总会关联起乐观派与悲观派,对于乐观派而言,他们认为事情总会往好的方向发展,总是认为坏的情况发生的概率特别小,可以无所顾忌地做事,但对于悲观派而已,他们总会认为发展事态如果不及时控制,以后就无法挽回了,即使无法挽回的局面几乎不可能发生。这两种派系...原创 2019-05-01 10:37:29 · 16888 阅读 · 0 评论 -
深入理解(6)Java并发AQS的共享锁的实现(基于信号量Semaphore)
原文:https://blog.youkuaiyun.com/javazejian/article/details/72772461信号量-SemaphoreSemaphore共享锁的使用信号量(Semaphore),又被称为信号灯,在多线程环境下用于协调各个线程, 以保证它们能够正确、合理的使用公共资源。信号量维护了一个许可集,我们在初始化Semaphore时需要为这个许可集传入一个数量值,该数量...原创 2019-05-01 10:36:47 · 17017 阅读 · 0 评论 -
深入理解(5)Java内存模型(JMM)及volatile关键字
原文:https://blog.youkuaiyun.com/javazejian/article/details/72772461理解Java内存区域与Java内存模型Java内存区域Java虚拟机在运行程序时会把其自动管理的内存划分为以上几个区域,每个区域都有的用途以及创建销毁的时机,其中蓝色部分代表的是所有线程共享的数据区域,而绿色部分代表的是每个线程的私有数据区域。方法区(Method...原创 2019-05-01 10:35:26 · 16775 阅读 · 0 评论 -
深入理解(4)Java类型信息(Class对象)与反射机制
原文:https://blog.youkuaiyun.com/javazejian/article/details/72772461深入理解Class对象RRTI的概念以及Class对象作用认识Class对象之前,先来了解一个概念,RTTI(Run-Time Type Identification)运行时类型识别,对于这个词一直是 C++ 中的概念,至于Java中出现RRTI的说法则是源于《Thin...原创 2019-05-01 10:34:40 · 16944 阅读 · 1 评论 -
深入理解(3)Java类加载器(ClassLoader)
原文:https://blog.youkuaiyun.com/javazejian/article/details/72772461类加载的机制的层次结构每个编写的”.java”拓展名类文件都存储着需要执行的程序逻辑,这些”.java”文件经过Java编译器编译成拓展名为”.class”的文件,”.class”文件中保存着Java代码经转换后的虚拟机指令,当需要使用某个类时,虚拟机将会加载它的”.cl...原创 2019-05-01 10:33:58 · 16800 阅读 · 0 评论 -
深入理解(2)Java枚举类型(enum)
原文:https://blog.youkuaiyun.com/javazejian/article/details/72772461理解枚举类型枚举类型是Java 5中新增特性的一部分,它是一种特殊的数据类型,之所以特殊是因为它既是一种类(class)类型却又比类类型多了些特殊的约束,但是这些约束的存在也造就了枚举类型的简洁性、安全性以及便捷性。下面先来看看什么是枚举?如何定义枚举?枚举的定义回忆...原创 2019-05-01 10:29:55 · 17048 阅读 · 0 评论 -
深入理解(1)Java注解类型(@Annotation)
原文:https://blog.youkuaiyun.com/javazejian/article/details/72772461理解Java注解实际上Java注解与普通修饰符(public、static、void等)的使用方式并没有多大区别,下面的例子是常见的注解:public class AnnotationDemo { //@Test注解修饰方法A @Test pub...原创 2019-05-01 10:28:09 · 17379 阅读 · 0 评论 -
jvm系列(10):教你如何成为Java的OOM Killer
前言虽然事隔半年,当时排查线上OOM事故的过程记忆犹新,每一个步骤都历历在目,感谢业务组、系统部、压测组、监控与应急部对架构组的强力支持,得以让这个Java内存问题水落石出,经过半年多的全面的应用日志 切割方式的改造,现在基本没有OOM的问题了,线上服务运行非常健康,对可用性的保障起到了很大的作用,如果你在经历OOM,读了这个文章会有很大的启发。Become OOM Killer我们都知道J...原创 2019-05-01 14:44:56 · 16536 阅读 · 0 评论 -
jvm系列(9):如何优化Java GC
GC优化是必要的吗?或者更准确地说,GC优化对Java基础服务来说是必要的吗?答案是否定的,事实上GC优化对Java基础服务来说在有些场合是可以省去的,但前提是这些正在运行的Java系统,必须包含以下参数或行为:内存大小已经通过**-Xms和-Xmx**参数指定过运行在server模式下(使用**-server**参数)系统中没有残留超时日志之类的错误日志换句话说,如果你在运行时没有...原创 2019-05-01 14:44:14 · 16601 阅读 · 1 评论 -
jvm系列(8)jvm调优-命令篇
运用jvm自带的命令可以方便的在生产监控和打印堆栈的日志信息帮忙我们来定位问题!虽然jvm调优成熟的工具已经有很多:jconsole、大名鼎鼎的VisualVM,IBM的Memory Analyzer等等,但是在生产环境出现问题的时候,一方面工具的使用会有所限制,另一方面喜欢装X的我们,总喜欢在出现问题的时候在终端输入一些命令来解决。所有的工具几乎都是依赖于jdk的接口和底层的这些命令,研究这些命...原创 2019-05-01 14:43:07 · 17367 阅读 · 0 评论 -
jvm系列(7):jvm调优-工具篇
对于大型 JAVA 应用程序来说,再精细的测试也难以堵住所有的漏洞,即便我们在测试阶段进行了大量卓有成效的工作,很多问题还是会在生产环境下暴露出来,并且很难在测试环境中进行重现。JVM 能够记录下问题发生时系统的部分运行状态,并将其存储在堆转储 (Heap Dump) 文件中,从而为我们分析和诊断问题提供了重要的依据。其中VisualVM和MAT是dump文件的分析利器。jdk自带的工具jco...原创 2019-05-01 14:41:21 · 16765 阅读 · 0 评论 -
jvm系列(6):Java服务GC参数调优案例
本文介绍了一次生产环境的JVM GC相关参数的调优过程,通过参数的调整避免了GC卡顿对JAVA服务成功率的影响。这段时间在整理jvm系列的文章,无意中发现本文,作者思路清晰通过步步分析最终解决问题。我个人特别喜欢这种实战类的内容,经原作者的授权同意,将文章分享于此。备注部分为本人添加,主要起到说明的作用。原文出处:https://segmentfault.com/a/119000000517...原创 2019-05-01 14:39:35 · 16250 阅读 · 0 评论 -
jvm系列(5)Java GC 分析
Java GC就是JVM记录仪,书画了JVM各个分区的表演。什么是 Java GCJava GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露和溢出的问题,也不需要像C程序员那样战战兢兢。这是因为在Java虚拟机中,存在自动内存管理和垃圾清扫机制。概括地说,该机制对...原创 2019-05-01 14:37:23 · 16316 阅读 · 0 评论 -
jvm系列(4)Java 8-从持久代到metaspace
Java 8介绍了一些新语言以及运行时新特点。其中一个特点便是完全移除了持久代(PermGen),自从Oracle公司发布了JDK1.7后就已经宣布了这个决定。还有比如内部字符串,从JDK1.7开始就从持久代移除了,JDK8的发布彻底废除了它。在这个部分,我们会讨论持久代的继任者:Metaspace。当执行一个Java程序并出现了“泄露”类元数据对象时我们会比较HotSpot 1.7和HotSp...原创 2019-05-01 14:35:06 · 16378 阅读 · 1 评论 -
jvm系列(3)7种JVM垃圾收集器特点,优劣势、及使用场景
1.新生代的收集器包括:SerialPraNewParallel Scavenge2.老年代的收集器包括:Serial OldParallel OldCMS3.回收整个Java堆(新生代和老年代)G1收集器新生代垃圾收集器1.Serial串行收集器-复制算法Serial收集器是新生代单线程收集器,优点是简单高效,算是最基本、发展历史最悠久的收集器。它在进行垃圾收...原创 2019-05-01 14:34:17 · 16221 阅读 · 0 评论 -
jvm系列(2)4种垃圾回收算法、垃圾回收机制与总结
垃圾回收算法1.标记清除标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段。在标记阶段首先通过根节点(GC Roots),标记所有从根节点开始的对象,未被标记的对象就是未被引用的垃圾对象。然后,在清除阶段,清除所有未被标记的对象。适用场合:存活对象较多的情况下比较高效适用于老年代缺点:容易产生内存碎片,再来一个比较大的对象时(典型情况:该对象的大小大于空闲表中的每一块...原创 2019-05-01 14:33:15 · 16335 阅读 · 0 评论 -
jvm系列(1)运行时数据区
1 JVM1.1 JVM运行时数据区域JDK 1.7 及以往的 JDK 版本中,Java 类信息、常量池、静态变量都存储在 Perm(永久代)里。类的元数据和静态变量在类加载的时候分配到 Perm,当类被卸载的时候垃圾收集器从 Perm 处理掉类的元数据和静态变量。当然常量池的东西也会在 Perm 垃圾收集的时候进行处理。JDK 1.8 的对 JVM 架构的改造将类元数据放到本地内存中(元...原创 2019-05-01 14:31:58 · 16215 阅读 · 0 评论 -
java基础篇(25) 集合入门
集合框架:Java中的集合框架大类可分为Collection和Map;两者的区别:Collection是单列集合;Map是双列集合Collection中只有Set系列要求元素唯一;Map中键需要唯一,值可以重复Collection的数据结构是针对元素的;Map的数据结构是针对键的。泛型:在说两大集合体系之前先说说泛型,因为在后面的集合中都会用到;所谓的泛型就是:类型的参数化泛型...原创 2019-05-02 09:34:55 · 10877 阅读 · 0 评论 -
java基础篇(24) equals()方法和“==”运算符
equals()超类Object中有这个equals()方法,该方法主要用于比较两个对象是否相等。该方法的源码如下:public boolean equals(Object obj) { return (this == obj); }我们知道所有的对象都拥有标识(内存地址)和状态(数据),同时“==”比较两个对象的的内存地址,所以说使用Object的equals()方法是比...原创 2019-05-02 09:30:56 · 10736 阅读 · 1 评论 -
java基础篇(23) Lambda 表达式的常见应用场景
Lambda 表达式是 Java 8 引入的新特性,结合 forEach 方法可以更方便地实现遍历。此外,它还可代替 Runnable 类,大大简化了代码的编写。下面介绍了一些常见的应用场景,在这些场景中适时地使用 Lambda 表达式要比通常的方式来得更加简洁和方便。列表迭代对一个列表的每一个元素进行操作,不使用 Lambda 表达式时如下:List<Integer> num...原创 2019-05-02 09:26:33 · 10798 阅读 · 0 评论 -
java基础篇(22) equals()与hashCode()方法详解
概述java.lang.Object类中有两个非常重要的方法:public boolean equals(Object obj)public int hashCode()Object类是类继承结构的基础,所以是每一个类的父类。所有的对象,包括数组,都实现了在Object类中定义的方法。equals()方法详解equals()方法是用来判断其他的对象是否和该对象相等.equals()...原创 2019-05-02 09:25:11 · 10692 阅读 · 0 评论 -
java基础篇(21) Java 技术之动态代理机制
静态代理常规的代理模式有以下三个部分组成:功能接口interface IFunction { void doAThing();}功能提供者class FunctionProvider implement IFunction { public void doAThing { System.out.print("do A"); }}功能代理者...原创 2019-05-02 09:19:59 · 10734 阅读 · 1 评论 -
java基础篇(20) 理解String 及 String.intern() 在实际中的应用
String的深入解析首先String不属于8种基本数据类型,String是一个对象。 因为对象的默认值是null,所以String的默认值也是null;但它又是一种特殊的对象,有其它对象没有的一些特性。new String()和new String(“”)都是申明一个新的空字符串,是空串不是null;-String str=”kvill”; String str=new ...原创 2019-05-02 09:16:51 · 10667 阅读 · 0 评论 -
java基础篇(19) static关键字
Static变量static关键字在类中用static声明的成员变量为静态成员变量,它为该类的公用变量,在第一次使用时初始化,对于该类的所有对象来说,static成员变量只有一份。可以通过引用或者类名访问静态成员原来一个类里面的成员变量,每new一个对象,这个对象就有一份自己的成员变量,因为这些成员变量都不是静态成员变量。对于static成员变量来说,这个成员变量只有一份,而且这一...原创 2019-05-02 09:14:16 · 10623 阅读 · 0 评论 -
java基础篇(18) 深入剖析Java中的装箱和拆箱
一.什么是装箱?什么是拆箱?我们知道 Java为每种基本数据类型都提供了对应的包装器类型,至于为什么会为每种基本数据类型提供包装器类型在此不进行阐述,有兴趣的朋友可以查阅相关资料。在Java SE5之前,如果要生成一个数值为10的Integer对象,必须这样进行:Integer i = new Integer(10);而在从Java SE5开始就提供了自动装箱的特性,如果要生成一个数值为1...原创 2019-05-02 09:02:26 · 10502 阅读 · 1 评论 -
java基础篇(17) synchronized同步块和volatile同步变量
初遇Java语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量。这两种机制的提出都是为了实现代码线程的安全性。其中 Volatile 变量的同步性较差(但有时它更简单并且开销更低),而且其使用也更容易出错。synchronized同步块Java中的同步块用synchronized标记。同步块在Java中是同步在某个对象上。所有同步在一个对象上的同步块在同时只能被一个线程进...原创 2019-05-02 08:55:34 · 10956 阅读 · 0 评论 -
java基础篇(16)异常的处理和设计及深入理解
一. 异常的定义今天暂时先不分享集合的知识,大家可以认真的看看java异常处理,会有收获的。在《java编程思想》中这样定义 异常:阻止当前方法或作用域继续执行的问题。虽然java中有异常处理机制,但是要明确一点,决不应该用"正常"的态度来看待异常。绝对一点说异常就是某种意义上的错误,就是问题,它可能会导致程序失败。之所以java要提出异常处理机制,就是要告诉开发人员,你的程序出现了不正常的情...原创 2019-05-02 08:47:27 · 10758 阅读 · 1 评论 -
java基础篇(15) java多态、方法重写、隐藏
一、Java多态性面向对象的三大特性:封装、继承、多态。多态的类型,分为以下两种:编译时多态: 指的是 方法重载。编译时多态是在编译时确定调用处选择那个重载方法,所以也叫 静态多态,算不上真正的多态。所以,一般说的多态都是运行时的多态。运行时多态: 由于 方法重写,所以想要确定引用变量所调用的方法的入口,必须根据运行时的引用变量所指向的实例对象来确定。从而使得同一个引用变量调用同一个方法...原创 2019-05-02 08:40:05 · 10713 阅读 · 0 评论 -
java基础篇(14) 方法重载解析
一、方法重载简介方法重载: 当两个(或多个)方法的名称相同,而参数的对应类型或个数不同时,我们就说方法重载了。当然,编译器也能识别出来。编译器是如何识别调用了哪个方法?在往下讲前,我们先来了解一下:编译器是怎么才能识别出程序调用了那个方法。其实,这个问题就是在问:在调用方法处,编译器能得到调用方法的什么信息,从而能找到对应的方法?我们一般的方法调用是这样的:method( vars )...原创 2019-05-02 08:38:23 · 11079 阅读 · 0 评论 -
java基础篇(13) 接口与嵌套接口
一、接口1. 接口简介接口: 是java的一种抽象类型,是抽象方法的集合。接口比抽象类更加抽象的抽象类型。接口语法:[修饰符] [abstract] interface 接口名 [extends 父接口名列表]{[public] [static] [final] 常量;[public] [abstract] 方法;[public] [static] 方法{};//JDK1.8后[p...原创 2019-05-02 08:36:57 · 10719 阅读 · 0 评论 -
java基础篇(12) 四种内部类详解
引言内部类,嵌套在另一个类的里面,所以也称为 嵌套类;内部类分为以下四种:静态内部类成员内部类局部内部类匿名内部类一、静态内部类静态内部类: 一般也称”静态嵌套类“,在类中用static声明的内部类。因为是static,所以不依赖于外围类对象实例而独立存在,静态内部类的可以访问外围类中的所有静态成员,包括private的静态成员。同时静态内部类可以说是所有内部类中独立性最高...原创 2019-05-02 08:35:28 · 10899 阅读 · 0 评论 -
java基础篇(11) 枚举类型
枚举类型Enum的简介1.什么是枚举类型枚举类型: 就是由一组具有名的值的有限集合组成新的类型。(即新的类)。好像还是不懂,别急,咱们先来看一下 为什么要引入枚举类型在没有引入枚举类型前,当我们想要维护一组 常量集合时,我们是这样做的,看下面的例子:class FavouriteColor_class{ public static final int RED = 1; ...原创 2019-05-02 08:33:00 · 11523 阅读 · 1 评论