Java必备知识
文章平均质量分 85
此专栏记录本人学习Java的一些笔记
tanwenfang
学无止境。
展开
-
7-1 垃圾回收之标记算法
1,对象被判定为垃圾的标准:没有被其他对象引用。没有被任何对象所引用,对于系统而言,它就是垃圾,其占据的内存就要被释放,同时此对象也要被销毁。2,判断对象是否为垃圾的算法(1)引用计算算法(2)可达性分析算法3,引用计算算法判断对象的引用数量通过判断对象的引用数量来决定对象是否可以被回收;堆中每个对象实例都有一个引用计数器,被引用则+1,完成引用则-1;当一个对象被创建时,若该对象实例分配给一个引用变量,该对象实例的引用计数器就会被设置为1,若该对象又被另外一个对象所引用,则该对象的引用原创 2020-09-16 17:47:17 · 322 阅读 · 0 评论 -
Java多线程与并发(原理)-9.1 synchronized
线程安全问题的主要诱因:存在共享数据(也称临界资源)存在多条线程共同操作这些共享数据解决问题的根本方法:同一时刻有且只有一个线程在操作共享数据,其他线程必须等到该线程处理完数据后,再对共享数据进行操作。互斥锁的特性:互斥性:即在同一时间只允许一个线程持有某个对象锁,通过这种特性来实现多线程的协调机制,这样在同一时间只有一个线程对需要同步的代码块(复合操作)进行访问。互斥性也称为操...原创 2019-10-15 21:36:49 · 208 阅读 · 5 评论 -
Java多线程与并发-8.8 yield函数和interrupt函数
1,yield函数当调用Thread.yield函数时,会给线程调度器一个当前线程愿意让出CPU使用的暗示,但是线程调度器可能会忽略这个暗示。yield()不会对当前线程的锁造成影响。2,interrupt函数如何中断线程?1,已经被抛弃的方法:stop(),suspend(),resume();2,目前使用的方法:(1)调用interrupt(),通知线程应该中断了<1&g...原创 2019-06-16 16:10:26 · 346 阅读 · 0 评论 -
Java多线程与并发-8.7 notify和notifyall的区别
先了解一下两个概念:(1)锁池:假设线程A已经拥有了某个对象(不是类)的锁,而其他线程B,C想要调用这个对象的某个synchronized方法(或者块),由于B,C线程在进入对象的synchronized方法(或者块)之前必须先获得该对象锁的拥有权,而恰巧该对象的锁目前正被线程A所占用,此时B,C线程会被阻塞,进入一个地方去等待锁的释放,这个地方就是该对象的锁池。(2)等待池:假设线程A调用了...原创 2019-06-16 14:59:56 · 535 阅读 · 0 评论 -
Java多线程与并发-8.6 sleep和wait的区别
sleep和wait的区别1,基本的区别sleep是Thread类的方法,wait是Object类中定义的方法sleep方法可以在任何地方调用wait方法只能在synchronized方法或synchronized块中使用2,最主要的本质区别Thread.sleep只会让出CPU,不会导致锁行为的改变Object.wait不仅让出CPU,还会释放已经占有的同步资源锁下面来验...原创 2019-06-16 14:37:47 · 296 阅读 · 0 评论 -
Java多线程与并发-8.5 线程的状态
从源码可知,线程的状态有以下6种:从源码可知,线程的状态有以下6种:(1)新建(New):创建后尚未启动的线程的状态(2)运行(Runnable):包含Running和Ready。处于此状态的线程,有可能正在执行,也有可能在等待cpu为它分配执行时间,处于Running状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu的使用权,处于Ready状态的线程,在获得cpu时间后,就变为...原创 2019-06-16 14:29:25 · 155 阅读 · 0 评论 -
Java多线程与并发-8.4 如何实现处理线程的返回值
我们知道给run方法传参有三种方式,即:构造函数传参成员变量传参回调函数参数如何实现处理线程的返回值?关于线程的返回值,就是一个痛点了。因为我们有的程序的执行,是依赖于子任务的返回值进行的,当子任务交由子线程去执行的时候,是需要获取到它们的返回值的,这个时候怎么办?即实现子任务的返回值的方法是什么?实现的方式主要有3种:(1)主线程等待法,即我们可以让主线程循环等待,直到目标子线...原创 2019-06-16 14:21:50 · 1165 阅读 · 0 评论 -
Java多线程与并发-8.3 Thread和Runnable的关系
Thread是一个类,而Runnable是一个接口。Thread实现了Runnable接口。Runnable里面只有一个抽象的run()方法,也就是说Rnnable这个接口并没有具备多线程的特性,它是依赖Thread里面的start()方法去创建一个子线程,再在这个子线程里面再去调用Thread实现好了的run()方法,去执行相应的业务逻辑,才能让Thread这个类具备多线程的特性。下面对Thr...原创 2019-06-16 14:03:08 · 246 阅读 · 0 评论 -
Java多线程与并发-8.2 线程的start和run的区别
Thread中的start和run方法的区别就是:调用start()方法会创建一个新的子线程并启动run()方法只是Thread的一个普通方法调用下面我们来验证一下。如下代码,先使用run()方法:package thread;public class ThreadTest { private static void attack() { System.out.println...原创 2019-06-16 11:49:34 · 252 阅读 · 0 评论 -
Java多线程与并发-8.1 进程和线程的区别
下面的笔记会跟一些Java源码。我们选择jdk8进行跟踪。我们要是跟源码,最好选择jdk8,jdk11,因为它们是Oracle长期支持的版本。进程和线程的由来,请看下面的图:进程是资源分配的最小单位,线程是CPU调度的最小单位所有与进程相关的资源,都被记录在PCB(进程控制块)中进程是抢占处理机的调度单位;线程属于某个进程,共享其资源线程只由堆栈寄存器,程序计数器和TCP(线程控制...原创 2019-06-16 11:23:24 · 138 阅读 · 0 评论 -
数据库-3.7 索引额外的问题之如何调优SQL
如何定位并优化慢查询Sql?具体场景具体分析,只提出大致思路。1,根据慢日志定位慢查询Sql。2,使用explain等工具分析Sql3,修改Sql或者尽量让sql走索引MySQL有很多自带的系统变量,咱们可以通过查询一些变量来得知有哪些配置信息:这里我们是要查询跟慢日志相关的一些信息,show VARIABLES LIKE '%query%'然后查询一下慢SQL的数量(注意一下...原创 2019-10-24 08:40:50 · 241 阅读 · 0 评论 -
数据库-3.6 密集索引和稀疏索引的区别
密集索引和稀疏索引的区别:1,密集索引文件中的每个搜索码值都对应一个索引值。大家可以理解为:叶子节点保存的不仅仅是键值,还保存了位于同一行记录里的其他列的信息,由于密集索引决定了表的物理排列顺序,一个表只能有一个物理排列顺序,所以一个表只能创建一个密集索引。2,稀疏索引文件只为索引码的某些值建立索引项。大家可以理解为:叶子节点仅保存了键位信息,以及该行数据的地址。有的稀疏索引是仅保存了键位...原创 2019-10-16 20:43:12 · 936 阅读 · 0 评论 -
数据库-3.5 优化你的索引-运用Hash以及BitMap
Hash结构,就是根据Hash函数的运算,只需经过一次定位,便能找到需要查询数据所在的桶,不像B+树索引,要从根节点到非叶子节点,再到叶子节点,最后才能访问到我们的数据,这样可能会经过多次的IO访问,所以Hash索引的查询效率理论上要高于B+树索引。如上这张图,比如说我们要查找Sandra Dee这么一个人,那么根据Hash函数对Key,即Sandra Dee的运算,只需一次,我们便能定位到1...原创 2019-10-16 20:39:13 · 385 阅读 · 0 评论 -
数据库-3.4 优化你的索引-运用B+树
B+树是B树的变体,其定义基本上与B树相同,除了:1,非叶子节点的子树指针与关键字个数相同;2,非叶子节点的子树指针P[i],指向关键字值[K[i],K[i+1])的子树;如下图,我们把K[i]设为10,那么K[i+1]就是20,那么可以看到10对应的子树里面的值均小于20,同时均大于或等于10。3,非叶子节点仅用来索引,数据都保存在叶子节点中;也就是说,当咱们要搜索10相关的数据的时候...原创 2019-10-16 20:35:00 · 193 阅读 · 0 评论 -
数据库-3.3 优化你的索引-运用B树
B树的示意图如下:B树,又叫平衡多路查找树。如果每个节点最多有m个孩子,那么这样的树就是m阶树,咱们可以看到,该图就是3阶B树的样子。当然现实中咱们索引每个节点的孩子数上限肯定是远大于3的。每个存储块中,主要包含了关键字和指向孩子的指针,那么最多能有几个孩子,取决于每个存储块的容量以及数据库的相关配置。所以,通常情况下,这个m是很大的。接下来看看B-Tree的特征:1,根节点至少包括两个孩...原创 2019-10-16 20:33:05 · 227 阅读 · 0 评论 -
数据库-3.2 优化你的索引-运用二叉查找树
先看一下二叉树的示意图:二叉查找树是每个节点最多有两个子树的数据结构,通常子树被称为左子树或右子树。二叉查找树的重要性质是,对于树中的每个节点x,它的左子树的任意节点的值均小于x,右子树的任意节点的值都大于x。如果用二叉查找树来作为我们的索引,确实能够提升查询效率。这里需要我们注意的是,我们说的索引的存储块和我们之前说的数据库的最小存储单位——块或页,实际上并非一一对应,只是为了方便我们的理解...原创 2019-10-16 20:28:48 · 330 阅读 · 0 评论 -
数据库-3.1 数据库架构
如何设计一个关系型数据库?一个关系型数据库应该包括以下内容:数据库最主要的功能是什么?就是存储数据,因此它会有一个存储模块,来负责存储我们的数据,存储模块就类似于我们的OS文件系统,将数据最终持久化存入磁盘中,如存入机械硬盘,或者SSD固态硬盘,抑或是它们的磁盘阵列矩阵中。可是光有存储是不行的,我们还要组织并用到这些数据,因此咱们需要有程序的实例,用逻辑结构来映射物理结构来,并且在程序中提...原创 2019-10-16 20:24:00 · 202 阅读 · 0 评论 -
Linux常用命令-“find,grep,管道操作符|,awk,sed”学习
1,查找特定文件–find(1)当前目录下查找指定文件名的文件(精确查找)(2)全局查找指定文件名的文件(模糊查找)(3)查找以某个前缀开头的文件,区分大小写(4)指定目录下,查找某个前缀开头的文件,不区分大小写更多关于find指令的使用说明:man find2,检索文件内容–grep 和 管道操作符“|”grep的全称:Global Regular Expressio...原创 2019-06-01 19:16:32 · 1103 阅读 · 0 评论 -
计算机网络核心知识--1.6 HTTP相关
HTTP,即超文本传输协议,属于应用层的协议,它是一个基于请求与响应模式的无状态的应用层的协议,常基于TCP的连接方式,HTTP1.1版本中,给出了一种持续的连接机制-keep-alive,绝大多数的web开发都是构建在HTTP协议之上的web应用。HTTP协议的主要特点可以概括如下:(1)支持客户/服务器模式。HTTP协议工作于客户端/服务端架构之上,浏览器作为HTTP客户端,通过url向...原创 2019-04-15 15:01:41 · 285 阅读 · 0 评论 -
计算机网络核心知识--1.5 TCP的滑动窗口
了解滑动窗口之前,先了解两个概念,即RTT和RTO。(1)RTT:发送一个数据包到收到对应的ACK,所花费的时间。简单来说,就是我发送一个数据包,然后对端回应一个ACK,那么当我接收到ACK之后,就能计算出从我发出包到接到回应过了多久,这个时间就是RTT。(2)RTO:重传时间间隔。TCP在发送一个数据包之后,会启动一个重传定时器,而RTO就是这个定时器的重传时间。再通俗一点地讲,我一开始...原创 2019-04-15 10:28:59 · 1076 阅读 · 0 评论 -
计算机网络核心知识--1.4 TCP和UDP的区别
TCP的相关知识点参考专栏文章:计算机网络核心知识–1.2 TCP的三次握手UDP的报文结构:UDP的特点:(1)面向非连接。传输数据时,源端和终端不建立连接,当它想传送时,就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上,在发送端,UDP传送数据的速率仅仅是受应用程序生成数据的速度,计算机的能力和传输带宽的限制。在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读...原创 2019-04-15 10:12:39 · 294 阅读 · 0 评论 -
计算机网络核心知识--1.3 TCP的四次挥手
“挥手”是为了终止连接。TCP四次挥手的流程图如下:第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态;第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态;第三次挥手:Server发送一个FI...原创 2019-04-15 10:06:19 · 300 阅读 · 0 评论 -
计算机网络核心知识--1.2 TCP的三次握手
TCP协议与IP协议:IP协议是无连接的通信协议,它不会占用两个正在通信的计算机之间的通信线路,这样,IP就降低了对网络线路的需求,每条线可以同时满足许多不同计算机之间的通信需要,通过IP,消息或者其他数据会被分割成较小的独立的包,并通过因特网在计算机之间传送,IP负责将每个包路由至它的目的地,但IP协议没有做任何事情来确认数据包是否按顺序发送,或者包是否被破坏,所以IP数据包是不可靠的,需要由...原创 2019-04-08 17:15:46 · 392 阅读 · 0 评论 -
计算机网络核心知识--1.1 网络核心知识讲解(OSI七层参考模型)
网络核心知识,这里主要是了解OSI七层参考模型。先看下七层参考模型的示意图:OSI(开放网络互联)参考模型,是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系。主要分7层:(1)物理层:解决两台物理机之间的通信需求,简单讲就是机器A往机器B发送比特流,机器B要能够收到这些比特流。物理层主要定义了物理设备的标准,如网线的类型,光纤的接口类型,各种传输介质的传输速率,其...原创 2019-04-08 16:57:03 · 1240 阅读 · 0 评论 -
@Controller和@RestController的区别
如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面,或者html页面,或者ftl页面,配置的视图解析器InternalResourceViewResolver就不起作用,返回的内容就是return里的内容。@RestController是@Controller+@ResponseBody两个注解的结合,返回json数据的时候,不...原创 2019-09-24 21:21:28 · 142 阅读 · 0 评论 -
HashMap的底层实现原理
HashMap的底层是通过数组+链表(即哈希表)的结构来实现的。HashMap的实例有两个参数影响其性能:初始容量 和 加载因子。初始容量只是哈希表在创建时的容量,加载因子是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目超出了加载因子与当前容量的乘积时,通过调用rehash方法将容量翻倍。简单说下HashMap的工作原理:HashMap基于hashing原理,我们通过p...原创 2019-09-07 20:57:53 · 4839 阅读 · 1 评论 -
String,StringBuilder,StringBuffer的区别
String,StringBuilder,StringBuffer的区别:String是不可变的字符串;StringBuffer:可变字符串、效率低、线程安全;StringBuilder:可变字符序列、效率高、线程不安全。问答:为什么String是不可变的?答:如,String s = “ABCDE”;这句代码,s只是一个String对象得引用,并不是对象得本身,对象在内存中是一块...原创 2019-09-06 21:37:17 · 117 阅读 · 1 评论 -
Java集合类小结
1,ListListArrayList保持元素的插入次序,非线程安全,查询快,增删慢,底层实现为数组LinkedList有序,非线程安全,查询慢,增删快,底层为链表Vector有序,线程安全,查询快,增删慢,底层为数组2,MapMapHashMapHashMap是Map基于散列表的实现。插入和查询键值对的开销是固定的。Li...原创 2019-09-06 21:33:38 · 97 阅读 · 0 评论 -
forward和redirect的区别
看表:原创 2019-09-22 18:51:13 · 96 阅读 · 0 评论