java基本知识
文章平均质量分 69
予亭
活泼开朗,爱好广泛。
展开
-
线程池submit方法如何获取执行结果
FutureTask 来获取线程结果原创 2022-01-15 21:22:20 · 1664 阅读 · 0 评论 -
Comparable与Comparator排序对比
Comparable接口,一般是采取实现类接口compareTo方法的方式来达到内部排序的目的。也就这一个方法,一般也叫做自然排序,也就是实现了就只能按照这个排序规则,不能随意更改排序规则。例子:public class Book implements Comparable<Object> { // 定义名为Book的类,默认继承自Object类 public int id;// 编号 public int compareTo(Ob原创 2021-07-11 16:29:36 · 256 阅读 · 0 评论 -
为什么 java wait/notify 必须与 synchronized 一起使用
为什么 java wait/notify 必须与 synchronized 一起使用这个问题就是书本上没怎么讲解,就是告诉我们这样处理,但没有解释为什么这么处理?我也是基于这样的困惑去了解原因。synchronizedwait/notify这两个是Java对象都有的属性,表示这个对象的不用synchronized 会怎么样lost wake up参考博客为什么 java wait/notify 必须与 synchronized 一起使用,jvm究竟做了些什么面试官:为什么wait()方法要原创 2021-03-23 09:16:01 · 2658 阅读 · 1 评论 -
协程概念
协程的诞生线程切换在IO密集型的程序中由于IO操作远远小于CPU的操作,所以往往需要CPU去等IO操作。同步IO下系统需要切换线程,让操作系统可以再IO过程中执行其他的东西。这样虽然代码是符合人类的思维习惯但是由于大量的线程切换带来了大量的性能的浪费,尤其是IO密集型的程序。异步IO所以人们发明了异步IO。就是当数据到达的时候触发我的回调。来减少线程切换带来性能损失。但是这样的坏处也是很大的,主要的坏处就是操作被 “分片” 了,代码写的不是 “一气呵成” 这种。 而是每次来段数据就要判断 数原创 2020-11-29 16:34:58 · 3209 阅读 · 2 评论 -
单例模式多线程引发的思考
单例模式内存屏障和重排序单例模式中懒汉式的方式中,其中提到了双重校验锁的内容,比直接在方法上枷锁要好,但很多博客写的都有问题,他们忽视了内存屏障和指令重排序,一般是要给变量加volatile关键词,我们先看下正确的写法:public class Singleton { /** * 该函数限制用户主动创建实例 */ private Singleton() {} privat...原创 2020-11-08 16:25:16 · 187 阅读 · 0 评论 -
线程池一些知识解答
线程池如何保持线程复用其实开启一个线程后,再线程的run 方法中 写一个循环,执行一个任务后就从队列中获取任务对象Worker,Worker对象是线程池定义的对象,一个Worker对象中都有一个线程,可以任务Worker的多少就表明线程的多少,不过代码里没有利用Worker集合的大小来做判断,而是利用了AtomicInteger对象来控制线程数量。每一个任务 也都是一个Runnable对象在线程池里每一个任务也都是一个可执行的Runnable对象,在线程的run 方法中执行 task.run()方法原创 2020-11-08 15:42:55 · 181 阅读 · 1 评论 -
5分钟思考网络模型:IO、BIO、NIO
IOIO其实指的是Input/Output,是指输入输出,主要用来传输数据,各个设备之间的数据传输,那么为何慢慢有了很多IO?NIO、BIO、AIO等,这些都是其实现形式,基于不同的操作系统机制来包装的IO模型,我们慢慢就会知道这些模型的区别。IO流的分类根据处理数据类型的不同分为:字符流和字节流根据数据流向不同分为:输入流和输出流字符流和字节流字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。 字节流和字符流的区别:读写单原创 2020-11-02 10:13:42 · 218 阅读 · 0 评论 -
Redis 底层数据结构
前言redis对外有一些5种基本类型,内部其实还是用的自己封装的数据结构,这篇文章主要是讲解数据结构的。简单动态字符串(SDS)链表字典跳跃表整数集合压缩列表简单动态字符串(SDS)参考博客...原创 2020-09-22 10:08:34 · 100 阅读 · 0 评论 -
Java 生产者消费者代码
介绍生产者和消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此并不直接通信,而是通过阻塞队列进行通信,所以生产者生产完数据后不用等待消费者进行处理,而是直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列中获取数据,阻塞队列就相当于一个缓冲区,平衡生产者和消费者的处理能力。单个线程实现生产者消费者生产者:import java.util.List;public class Producer implements Runnable{ private Lis原创 2020-09-22 09:29:39 · 2128 阅读 · 0 评论 -
Java lock锁的一些细节
前言lock是Java接口,采用乐观锁的设计思想,采用CAS操作来实现的一个锁,这几点跟synchronized不同,synchronized原始采用的是CPU悲观锁机制,参考博客深入Lock锁底层原理实现,手写一个可重入锁...原创 2020-09-19 19:47:29 · 1292 阅读 · 0 评论 -
jvm 垃圾回收小知识点
1、为什么新生代都是复制算法因为新生代对象生存时间比较短,80%都是要回收的对象,采用标记-清除算法则内存空间碎片化严重,采用复制算法可以灵活高效,且便与整理空间。2、老年代都是标记整理算法标记整理算法解决来标记-清除算法的内存碎片化的问题,又解决了复制算法的两个Survivor区的问题,因为老年代的空间比较大,不可能采用复制算法,特别占用内存空间,3、为什么要设置两个Survivor区...原创 2020-06-25 14:55:32 · 2800 阅读 · 2 评论 -
http、https和数字证书的相关知识
https对http进行了封装,http超文本传输协议,明文协议,于是容易被获取重要信息。变采用了基于ssl加密的https协议,用与客户端、服务器的数据传输。数字签名两个机器之间通信,公钥是公开的,那么公钥和机器怎么对应上?你说A机器的公钥是这个,但是也可能让人给改了,改成了别人的公钥,需要一个国际认证机构来管理和认证,他们来认证公钥与网站的映射关系。SSL在网站通过SSL来与用户建立...原创 2020-06-25 14:52:15 · 1879 阅读 · 0 评论 -
Java:Synchronized和lock锁分析
Synchronized有什么用如何实现的跟lock的区别原创 2020-06-14 13:51:47 · 411 阅读 · 0 评论 -
Java多线程循环打印ABC等问题
前言有很多中写法,希望可以慢慢都写出来。思路利用一个计数来除线程个数得到余数从而控制线程输出,并且利用一个Object的wait()和notify()方法来对线程的阻塞和唤醒,这里的技巧可以看看。wait()阻塞当前线程,等待被释放,继续执行当前线程notify()唤醒监视该对象的第一个线程,notifyAll()唤醒监视该对象的所有线程。代码: static volatile int state; // 线程共有,判断所有的打印状态 static final Obje原创 2020-05-22 23:45:51 · 1130 阅读 · 2 评论 -
Java问题排查的一些思路:cpu高、fgc多
前言平时虽然碰到一些问题,但是排查起来也有些没有头绪,总结一下,理清思绪。jstack 、jmap 、Jstatjstack能得到运行java程序的java stack和native stack的信息。可以轻松得知当前线程的运行情况。jmap: 得到运行java程序的内存分配的详细情况。例如实例个数,大小等 。Jstat:这是一个比较实用的一个命令,可以观察到classloa...原创 2020-04-24 15:13:23 · 765 阅读 · 0 评论 -
Java 类加载:字节码加载到Jvm中
前言生成字节码后,这些数据如何加载到jsm中,并怎么存储成为了问题,本文主要研究一下这个内容。加载到jvm 内存中通过javac 转换成.class 字节码文件,这个时候计算机还是不能直接识别的,由jvm加载class文件,JVM的类加载是通过ClassLoader及其子类来完成的,再翻译成二进制指令,Java字节码的执行是由JVM解释器引擎来完成,类的层次关系和加载顺序可以由下图来描述:...原创 2020-01-13 23:47:22 · 2983 阅读 · 0 评论 -
Java代码转化为字节码Class
前言基础知识也要懂一些,也可以帮助解决平常遇到的问题。编译:Java代码转化为字节码class低级语言是计算机认识的语言、高级语言是程序员认识的语言。那么如何从高级语言转换成低级语言呢?这个过程其实就是编译。从java源码到class文件是为了后面可以加载到jvm中,这个过程称为编译过程,这个过程由编译器来执行,使用javac命令执行得到class文件:javac HelloWorld.j...原创 2020-01-13 22:13:45 · 3314 阅读 · 0 评论 -
5分钟了解G1(Garbage-First)垃圾回收器
前言基于标记 - 整理算法,作用与年轻代老年代的垃圾回收器。适用场景:要求尽可能可控 GC 停顿时间;内存占用较大的应用。可以用 -XX:+UseG1GC 使用 G1 收集器,jdk9 默认使用 G1 收集器。流程1、初始标记(Initial Marking)停顿线程,但耗时很短2、并发标记(Concurrent Marking)从 GC Root 开始对堆中对象进行可达性分析,找...原创 2019-12-29 21:53:59 · 820 阅读 · 0 评论 -
CMS (Concurrent Mark Sweep):并行 标记清除 老年代垃圾回收机制
前言cms是一个基于 标记-清除 算法的老年代垃圾回收器,综合考虑多方因素结合多个垃圾回收算法组成的,适用场景:重视服务器响应速度,要求系统停顿时间最短。流程1、初始标记(CMS initial mark)“Stop The World”,仅仅只是标记一下 GC Roots 能直接关联到的对象,速度很快。2、并发标记(CMS concurrent mark)进行 GC Roo...原创 2019-12-29 21:53:28 · 3030 阅读 · 0 评论 -
10分钟快速了解 jvm 基础知识
前言快速的了解Jvm相关知识。内存模型开局一张jdk8 JVM图,然后是JDK低版本的JVM图。程序计数器作用:在CPU内部,运行速度最快的区域,因为多线程环境下,线程可以来回切换,切换后需要找到一开始Java执行的位置,因此程序计数器要线程私有,并且存储正在上一次执行到的虚拟机字节码指令的地址,获得线程后继续执行下去,执行本地方法该值为空。线程:每一个线程都有一个独立的程序计数...原创 2020-05-19 20:45:50 · 342 阅读 · 2 评论 -
2-3树 与 红黑树
前言红黑树直接看有点懵,涂上颜色,颜色转换,状态调整,说实话,一上来这么弄,我都不想看,有些东西你会知道是这么回事,但是你不清楚为什么这么做?为什么要涂上颜色?我自己也不太喜欢死记硬背,感觉很伤脑子,而且过一段时间就忘记了,这不是我的风格。2-3 树2-3 树 同2-3-4树 是差不多的概念,这也是一种平衡树,但有不一样的地方:一般平衡树一个节点只能存一个key,这种树的节点可以有两个k...原创 2019-11-25 23:15:56 · 272 阅读 · 0 评论 -
java hashmap 问题汇总
如何保证hashmap 大小一定是2的指数 static final int tableSizeFor(int cap) { int n = cap - 1; n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n &g...原创 2019-11-06 22:40:28 · 329 阅读 · 0 评论 -
have an error in your SQL syntax; check the manual that corresponds to your MySQL server version fo
错误信息如下you have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 17解决错误的原因有很多种,有可能是你插入的时候没传参数、空集合传进来等等。...原创 2019-10-17 17:24:04 · 291 阅读 · 0 评论 -
java stream流处理技巧汇总
Mapmap.entrySet().stream().map(Map.Entry::getValue)stream引用 Box one = new Box(); one.setId(1); one.setName("one"); Box two = new Box(); two.setId(2); tw...原创 2019-08-21 17:39:37 · 1946 阅读 · 0 评论