笔记
文章平均质量分 61
Fly_Fly_Zhang
初学java
展开
-
集合-PriorityQueue源码详解
特点: PriorityQueue队列里元素不能为null; 存储元素是可以重复的; PriorityQueue存储自定义类时,自定义类需要实现Comparable接口,否则会抛出异常;或者在构建PriorityQueue时,实现Comparator;Comparator和Comparable的区别: 方法不同:Comparator需要实现的是compare()方法;Comp...原创 2019-03-06 21:42:25 · 362 阅读 · 0 评论 -
多线程-锁分类/锁优化(升级)以及锁对比
什么是锁池:假设线程A已经拥有了某个对象(不是类)的锁,而其它线程想要调用这个对象的某个synchronized方法或者synchronized块,由于这些线程在进入对象的synchronized方法之前必须获得该对象的锁的拥有权。但是该对象的锁目前正在被线程A拥有,所以这些线程就进入了该对象的锁池中。什么是等待池:假设一个线程A调用了某个对象的wait()方法,线程A就会释放该对象的锁(...原创 2019-04-14 20:44:08 · 524 阅读 · 0 评论 -
多线程-ConcurrentHashMap源码详解
概述:HashMap是集合中最常用的数据结构之一,由于HashMap非线程安全,因此不能用于并发访问场景。在jdk1.5之前,通常使用HashTable作为HashMap的线程安全版本。HashMap对读写操作进行全局加锁,在高并发的条件下会造成严重的锁竞争和等待,极大地降低了系统的吞吐量。优点:相比于HashTable以及Collections.synchronizedMap(),Conc...原创 2019-04-26 17:36:01 · 1527 阅读 · 5 评论 -
多线程-AbstractQueueSynchronizer源码详解 (AQS独占锁同步的实现)
什么是公平性锁:按照线程请求锁的顺序来获取锁。什么是非公平性锁:获取锁的线程不是按照先来后到的顺序获取,而是抢夺式获取锁。AbstractQueueSynchronizer(AQS)源码分析:基于FIFO(先进先出)队列,用于构建锁或者其它相关同步装置的基础框架。AQS的功能可以分为两大类:独占功能和共享功能它的所有子类中,要么实现并使用了它独占功能的API,要么使用了共享锁的功能,而...原创 2019-04-22 21:05:29 · 318 阅读 · 0 评论 -
多线程-ReentrantLock(可重入锁)与synchronized比较
可重入锁新特征:可中断响应;锁限时操作;公平锁;非公平锁;结合Condition使用;继承关系:Lock定义了锁的接口规范。ReentrantLock实现了Lock接口。AbstractQueuedSynchronizer中以队列的形式实现线程之间的同步。ReentrantLock的方法都依赖于AbstractQueuedSynchronizer的实现。sync是在Re...原创 2019-04-18 14:46:00 · 481 阅读 · 0 评论 -
多线程-ReentrantLock源码分析(公平锁和非公平锁)
什么是公平性锁:按照线程请求锁的顺序来获取锁。什么是非公平性锁:获取锁的线程不是按照先来后到的顺序获取,而是抢夺式获取锁。ReentrantLock源码分析:继承关系:ReentrantLock实现了Lock接口。该接口提供了一些通用的加锁解锁操作。void lock(): 加锁操作,得不到则阻塞直至得到锁。void lockInterruptibly() throws Int...原创 2019-04-23 12:23:45 · 581 阅读 · 0 评论 -
多线程-BlockingQueue(ArrayBlockingQueue/LinkedBlockingQueue)源码详解
BlockingQueue(阻塞队列)应用场景:BlockingQueue即阻塞队列是一种将ReentrantLock应用比较精彩的一种表现,它最经典的应用就是实现生产者与消费者模式 ;BlockingQueue接口特点:不接受null元素,当添加一个null元素时,会抛出NullPointerException异常可以限定容量实现主要用于生产者-消费者队列线程安全的,所有排队方...原创 2019-04-23 17:52:18 · 476 阅读 · 0 评论 -
多线程-死锁定位以及如何避免死锁(银行家算法)
什么是死锁:死锁是指两个或两个以上线程在执行过程中,由于竞争资源而造成的阻塞问题,若无外力作用下,他们将无法推荐下去,此时系统处于死锁状态。死锁的危害:导致程序得不到正确的运行结果:因为程序产生死锁,发生阻塞,不会继续向下执行。浪费资源:产生死锁,最少有两个线程会发生阻塞。产生新的死锁:产生死锁的线程会一直占有锁资源,会导致其它尝试获取该锁的线程也发生死锁,产生多米诺效应。死锁产生...原创 2019-04-28 18:26:38 · 1899 阅读 · 0 评论 -
JVM-计算机基础与Class文件加载机制(类加载时机/双亲委派模型/类加载过程/JIT即时编译器)
计算机基本概念:计算机存储元件: 寄存器:中央处理器CPU的一部分,是计算机中读写速度最快的存储元件,但是容量很少。 内存:属于独立的一个部件,是和CPU沟通的桥梁,用于存放CPU中的运算数据以及与外部存储器交换的数据。虽然现在内存的读写速度已经很快了,但是由于寄存器是在CPU上,所以对于内存的读写速度和对寄存器的读写速度还是有几个数量级的差距。 但是对于内存的读写I/O是很难消除的,...原创 2019-04-30 09:24:34 · 431 阅读 · 0 评论 -
多线程-volatile关键字和synchronized关键字详解
在多线程并发编程中synchronized关键字和volatile关键字都有重要意义,volatile是轻量级的synchronized;加了volatile关键字的变量都属于临界资源;什么是同步:同一时刻只能有一个线程对资源进行访问;什么是临界区?什么是临界资源?临界资源: 是一次 仅允许一个进程(线程) 使用的共享资源。各进程之间采取互斥的方式来访问临界资源。实现共享的资源称为临界资...原创 2019-04-14 12:25:41 · 484 阅读 · 0 评论 -
多线程-线程状态转换图以及线程状态介绍
线程状态转换图:两幅图仅是表现形式不同;线程状态转化图一:线程转换状态图二:线程的几种状态: 新建状态(New):用new语句创建的线程处于新建状态,此时它和其它java对象一样,仅仅在堆中分配了内存。 就绪状态(Runnable):当一个线程对象被创建后,其它线程调用它的start()方法,该线程就进入就绪状态。处于就绪状态的线程已经具备了运行条件,但还没有分配到CPU的使用...原创 2019-04-15 23:43:34 · 1162 阅读 · 0 评论 -
集合-TreeMap详解和TreeSet详解以及两者的区别
TreeMap底层数据结构:TreeMap底层数据结构是红黑树;红黑树特性:每个节点都只能是红色或者黑色;根节点是黑色;每个叶节点(NLL节点,空节点)是黑色的;如果一个节点是红色的,那么它的两个子节点都是黑的。也就是说在一条路径上不能出现相邻的两个红色节点;从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点;特点: TreeMap是非线程安全的 :但是可以用如下如下方...原创 2019-03-04 15:38:46 · 2640 阅读 · 0 评论 -
IO流-四种基类IO流详解(InputStream/OutputStream/Reader/Writer)以及mark()和reset()特殊的点
目录 :四大基类:InputStream(字节输入流)OutputStream(字节输出流)Reader(字符输入流)Writer(字符输出流)mark()和reset()方法详解:mark()和reset()方法详解JAVA中mark()和reset()用法的通俗理解如何复制一个文件:用IO流相关操作复制一个文本InputStream(字节输入流):基于FileInpu...原创 2019-03-20 13:22:08 · 1137 阅读 · 0 评论 -
IO流-流的基本概述(流的划分/字符和字节的区别/File文件类/Charset文件类)
目录:流的基本概述流的划分数据的读取流程字节和字符的区别几种常用字符码表 java提供的编码类:Charset File类详解得到给定路径下所有包含filter关键字的文件流的基本概述: 什么是流: 流的本质是数据传输,数据有序集合,能从一个端传输到另一端的过程流;java对数据的操作是通过流的方式,java用于流操作的对象都在IO包中; 流的划分:按照方向划分...原创 2019-03-16 17:19:55 · 477 阅读 · 0 评论 -
IO流-ObjectOutputStream/ObjectInputStream(对象输入/输出流)应用
对象操作类: ObjectInputStream:对象输入流 ObjectOutputStream: 对象输出流对于将读写对象涉及的序列化和反序列化,请点击此篇博客以ObjectOutputStream为例,表明具体用法package IOdemo;import java.io.*; class Person implements java.io.Serializable{...原创 2019-03-25 15:12:00 · 430 阅读 · 0 评论 -
IO流-序列化与反序列化详解
序列化:将对象转化为字节的过程称为序列化;反序列化:将字节转化为对象的过程称为反序列化;序列化的应用场景:数据在网络上传输也需要序列化;对象存储到本地磁盘上需要序列化;transient:序列化中使用的关键字被transient修饰的属性不进行序列化,反序列化时基本类型初始化为0,其它类型初始化为null;使用transient关键字的作用:网络数据传输中,敏感数据不进行传输...原创 2019-03-25 19:33:49 · 477 阅读 · 0 评论 -
IO流-Buffered(缓冲流)的应用以及流的使用规律
流的使用规律:1,明确是读操作还是写操作(数据源是当前程序或者数据目的地)读:InputStream ,Reader写:OutputStream,Writer2,明确是操作字符还是操作字节:明确操作基类 读:字节:InputStream;字符:Reader; 写:字节:OutputStream;字符:Writer;3,操作的具体介质:明确具体操作类 读:文件: ...原创 2019-03-25 20:55:35 · 887 阅读 · 1 评论 -
IO流-RandomAccessFile/文件随机访问类详解
构造函数:**RandomAccessFile(File file, String mode):**创建从中读取和向其中写入(可选)的随机访问文件流,该文件由 File 参数指定。**RandomAccessFile(String name, String mode)原创 2019-03-25 21:42:50 · 318 阅读 · 0 评论 -
多线程-进程与线程详解
目录:什么是进程什么是线程线程的好处进程与线程的关系进程与线程的区别java中的main方法是进程还是线程java内存模型(JMM ( java Memory Model ))多线程编程的好处java线程与操作系统之间的关系进程间通信:共享内存原理虚拟地址空间用户空间和内核空间进程间的通信方式什么是进程:进程是操作系统资源分配的单位。如:I/O资源,内存资源等;...原创 2019-03-30 18:56:43 · 505 阅读 · 0 评论 -
多线程-启动线程的几种方式以及Thread类方法详解
线程之间的执行是相互独立的,哪一个线程优先执行取决于OS的调度线程的创建方式:实现Runnable接口:创建自定义类并实现runnable接口,且实现接口中的run方法;实例化自定义的类;将自定义类的实例作为参数传给Thread类,创建thread实例;调用thread实例的start,启动子线程;普通方式package ThreadDemo;class Thread1 i...原创 2019-03-31 11:15:02 · 1637 阅读 · 0 评论 -
JVM-对象在JVM中如何创建(对象定位方式/虚拟机创建对象步骤)
java是一门面向对象的语言,java程序运行过程中无时无刻都有对象被创建出来。在语言层面上,创建对象(克隆,反序列化)就是一个new关键字而已,但是虚拟机层面上却大不相同。虚拟机创建对象的步骤: 虚拟机遇到一条new指令,首先去检查这个指令的参数能否在运行时常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载,解析和初始化。如果没有,那必须先执行类的初始化过程。 类...原创 2019-04-29 20:43:30 · 932 阅读 · 0 评论 -
JVM-JVM(java虚拟机)抛出OutOfMemoryError(OOM)异常的8种原因及解决方法
JVM 发生OutOfMemoryError异常的八种原因: java堆空间。 GC开销超过限制。 请求的数组大小超过虚拟机限制。 Perm gen空间。 Metaspace。 无法新建本机线程。 发生了Stack_trace_with_native_method 。java堆空间:造成原因:无法在堆中分配对象。吞吐量增加。应用程序无意保存了对象的引用,对象无法被GC...原创 2019-05-05 16:32:47 · 3169 阅读 · 0 评论 -
网络-java中AIO(异步非阻塞)理解与应用
AIO(Asynchronous IO/异步非阻塞IO)概述:是NIO的2.0版本,AIO是jdk1.7之后提供的,需要借助于本地操作系统(unix/liunx提供的异步IO模型)。AIO最大的一个特性就是异步能力,这种能力对socket与文件IO都起作用。AIO其实是一种在读写操作结束之前允许进行其它操作的IO处理,AIO是对jdk1.4中提出的同步非阻塞NIO的进一步增强。AIO对应IO...原创 2019-06-13 17:05:01 · 1619 阅读 · 3 评论 -
netty-BuyeBuf(数据容器)
概述:java NIO提供了ByteBuffer作为字节容器,但是这个类过于复杂,而且有些繁琐,Netty使用了即易于使用又具备良好性能的ByteBuf来替代ByteBuffer。运作方式:所有的网络通信都涉及字节序列的移动,所以高效易用的数据结构是必不可少的。ByteBuf维护了两个不同的索引:一个用于读取,一个写入。当从ByteBuf读取时,它的readerIndex将会被递增已经读取...原创 2019-06-13 21:23:24 · 356 阅读 · 0 评论 -
网络-select/poll/epoll详解
概述:epoll和select都能提供多路IO复用的解决方案。在现在的linux内核里都能够被支持。epoll是linux所特有,而select则是POSIX所规定的,一般操作系统均有实现 。select:select原理::select函数监视的文件描述符分三类,分别是writefds,readfds,exceptfds 。调用select函数后会阻塞。直到有描述符就绪(有数据可读,可写...原创 2019-06-09 19:20:05 · 824 阅读 · 0 评论 -
java基础-String&StringBuilder&StringBuffer源码解析(基于JDK1.8)与区别
String:字符串常量String的值是不可变的,每次对String的操作都会生成新的String对象,这样不仅效率低下,而且大量浪费有限的内存空间。String初始值为"hello",然后再这个字符串后面加上新的字符串"world",这个过程需要重新在栈堆内存中开辟新的内存空间,最终得到"hello world",字符串相应的也需要开辟内存空间,这样两个字符串需要开辟三次内存空间,这是对...原创 2019-06-14 17:55:45 · 324 阅读 · 0 评论 -
MySQL-操作数据库(CRUD)&操作表(CRUD)
概述:MYSQL的SQL语句类别划分DDL(data definition language):数据库定义语言定义了不同的数据库,数据库表,列(字段),索引等数据库对象的定义;常用SQL:create(创建): 创建库,创建表;drop(删除):删除库,删除表,删除字段(和alter搭配使用)alter(更新): 更新字段;DML(data manipulation langu...原创 2019-06-19 20:26:37 · 2264 阅读 · 3 评论 -
数据库-数据库范式
基本概念:实体:现实世界中客观存在并可以被区别的事物。在数据库中往往是一个数据表。属性:教科书上解释为:“实体所具有的某一特性”,在关系数据库中,属性又是个物理概念,属性可以看作是“表的一列”。元组:表中的一行就是一个元组。分量:元组的某个属性值。在一个关系数据库中,它是一个操作原子,即关系数据库在做任何操作的时候,属性是“不可分的”。否则就不是关系数据库了。候选码和主码:表中可以唯一确...原创 2019-06-19 21:33:40 · 2113 阅读 · 0 评论 -
数据结构-BST树(镜像&前序&中序&后序&重构)
package com.AdvancedDataStructure.BSTTree;import java.util.LinkedList;import java.util.Stack;/** * @Created with IntelliJ IDEA * @Description: BST树代码演示 * @Package: com.AdvancedDataStructure.B...原创 2019-07-04 08:54:48 · 416 阅读 · 0 评论 -
数据结构-RBTree(红黑树)
概述:红黑树是不是一颗平衡树:不是,其高度差可以达到n红黑树结点左右子树高度差:长的不能超过短的二倍。因为需要保证所有路径上黑色节点数量相等,因此若一条节点路径全部是黑色,另一条路径红黑相间也只能插入2n个。红黑树的增删效率?高于AVL树,红黑树插入最多调整两次,删除调整三次。AVL树最多调整次数达到层数次。红黑树特点:每个节点都有颜色,非黑即红。所有叶子节点都是黑色的,叶...原创 2019-07-14 12:22:22 · 895 阅读 · 0 评论 -
netty-Netty线程模型&epoll-bug问题
Proactor&ReactorProactor和Reactor是两种经典的多路复用IO模型,主要用于在高并发,高吞吐量的环境下进行IO处理。IO多路复用机制都依赖于事件分发器,事件分发器将客户事件分发到不同的事件处理器中.Select&poll&epoll在操作系统级别上,select,poll,epoll是三个常用的IO多路复用机制。三者的具体区别与实现请读...原创 2019-06-13 15:43:45 · 1534 阅读 · 0 评论 -
netty-Netty框架简介
概述:netty-网络通信框架库(第三方库),本质是对NIO的封装。netty的实现:我们通过maven来导入netty。在maven的pom.xml中实现对netty的依赖。 <dependencies> <dependency> <groupId>junit</groupId> <artifactId&...原创 2019-06-13 10:45:39 · 592 阅读 · 0 评论 -
多线程-生产者和消费者模式的四种实现
什么是生产者和消费者模式:生产者和消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此并不直接通信,而是通过阻塞队列进行通信,所以生产者生产完数据后不用等待消费者进行处理,而是直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列中获取数据,阻塞队列就相当于一个缓冲区,平衡生产者和消费者的处理能力。wait/notify和synchronized配合实现:生产者...原创 2019-05-29 10:29:41 · 6822 阅读 · 24 评论 -
线程池-Executor框架概述及ThreadPoolExecutor源码详解
为什么要有线程池:降低资源消耗,通过重复利用已创建的线程来降低线程创建和销毁造成的损耗。提高响应速度。当任务到达时,任务可以不需要等待线程创建就能直接执行。提高线程的可管理性。线程是稀缺资源,如果无限制地创建线程,不仅会消耗系统资源,而且会降低系统的稳定性,适用线程池可以统一分配,调优和监控。线程池类的继承关系:Executor:(Executor框架,线程池所有实现类都实现了它的...原创 2019-05-08 17:42:10 · 386 阅读 · 0 评论 -
JVM-JVM内存模型(Java Memory Model)
JVM内存划分:方法区(线程共享): class对象,常量,静态变量,运行时常量池,JIT编译后的机器码也在方法区存放。堆区(线程共享): 对象,字符串常量池在堆区,垃圾回收的主要场地。程序计数器(PC寄存器,线程私有): 当前线程执行的字节码的位置指示器,也就是说指向当前正在运行的指令地址。java虚拟机栈(栈内存,线程私有): 保存局部变量表,基本数据类型,堆内存中对象的引用变量,...原创 2019-04-30 20:44:50 · 906 阅读 · 0 评论 -
网络-TCP/UDP详解
TCP释义:TCP头部信息字段释义:源端口号(Source Port)以及目的端口号(Destination Port):各占2个字节,端口是传输层和应用层的服务接口,用于寻找发送端和接受端的进程,一般来讲,通过端口号和IP地址,可以唯一确定一个TCP连接,在网络编程中,通常被称为一个socket接口。序号(Sequence Number ,seq):占四个字节,用来标识从TCP发送端...原创 2019-05-19 16:41:44 · 1118 阅读 · 0 评论 -
网络-IP协议详解
IP协议来源Internet上连接的所有计算机,我们称其为主机,为了实现各主机间的通信,每台主机都必须有一个唯一的网络地址。这样才不会在传输资料时出现混乱。Internet是由无数台计算机互相连接而成的。我们要确认网络上每一台计算机,靠的就是能唯一标识该计算机的网络地址,这个地址就是IP(Internet Protocol)地址,即用Internet协议语言表示的地址。IP协议的功能 寻...原创 2019-05-19 20:37:33 · 1163 阅读 · 0 评论 -
网络-五种IO模型/同步异步/阻塞非阻塞
网络中获取数据的读操作步骤:等待数据准备。数据从内核空间拷贝到用户空间。同步与异步:同步与异步是针对应用程序与内核的交互而言。也就是上图的read操作,从缓存中读取数据,如果缓存中数据还没有准备好,如果是同步操作,它会一直等待,直到操作完成。如果是异步操作,那么它会去做别的事情,等待数据准备好,内核通知它,它再去读取数据。同步过程中进程触发IO操作并等待或者轮询的去查看IO操作是...原创 2019-05-20 21:15:27 · 2100 阅读 · 6 评论 -
网络-OSI模型和TCP/IP模型
什么是计算机网路:计算机网络是通过传输介质,通信设施和通信协议,将分散在不同点的计算机设备互联起来实现资源共享和数据传输的系统。什么是网络编程:网络编程就是编写程序是联网的两个或者多个设备直接进行传输。网络分层模型: OSI: 应用层,表示层,会话层,传输层,网络层,数据链路层,物理层。 TCP/IP: 应用层,传输层,网络层,网络接口层。OSI(Open System Int...原创 2019-05-15 22:45:46 · 423 阅读 · 0 评论 -
网络-Java中NIO详解(Buffer/Selector/Channel三大组件原理)
NIO(non-blocking IO)概述:BIO为jdk1.4及以上版本里提供的新api ,为所有原始类型(boolean除外) 提供缓存支持的容器。NIO服务器实现模式为所有请求一个线程,即客户端发送的连接请求都会被注册到多路复用器上,多路复用器轮询到连接有IO请求时才启动一个线程进行处理。 这句话有问题NIO主要想解决的是BIO的大并发问题: 在使用同步IO的网络应用中,如果要同...原创 2019-05-26 17:35:53 · 2183 阅读 · 2 评论