- 博客(36)
- 收藏
- 关注
原创 数据类型和简单语句
目录Java基本结构数据类型输入输出和流程控制数组的特点Java基本结构java的三大特点:面向对象(OOP:Object OrientedProgramming):两个概念、三大特性:类和对象,封装继承多态健壮性:无指针,垃圾回收跨平台性:不同操作系统有不同的JVMjdk包含jre和一些开发工具和一些核心类库,jre包含jvm和一些核心类库的class文件。命令行编译:.java文件(源文件)→编译(javac...
2021-09-01 15:03:50
231
原创 类、对象、方法、构造器及特性
类及类的成员1、属性=成员变量=字段=域=instance属性可以在创建类的对象后手动初始化也可以直接在定义时初始化也可以使用它的默认初始化值(默认初始化值同数组);2、方法=函数=method类和类的对象的使用:1、创建类:包括创建属性,方法,构造器等等;2、实例化类=创建类的对象:new + 构造器;3、通过类的对象来调用类的成员:“对象名.属性名”和“对象名.方法名”;▲要深刻理解类,属性,方法调用之间的关系:要想调用一个方法/属性,只能通过该方法所在类的对象.
2021-09-01 15:00:35
417
原创 抽象类和接口
abstract关键字和抽象类和抽象方法:abstract关键字:只能修饰类和方法。1、abstract修饰类:该类不能实例化。该类的作用是让子类继承,从而重写该类中的方法,从而实现多态。2、abstract修饰方法:有抽象方法的类必为抽象类。该方法只有声明,没有参数和方法体。▲abstract只能用来修饰方法和类,不能修饰变量、代码块、构造器;不能用来修饰private方法,static方法,final方法,final类。▲抽象类中除了抽象方法其他可以包含和正常类一样的内容..
2021-09-01 14:57:22
239
原创 关于异常的笔记
异常:▲异常是一种类且出现在方法体内(包括main方法),不能出现在其他位置。异常体系:Error表示严重错误,一般是代码本身的问题。Exception为狭义的异常,其中RuntimeException为运行时异常,其他为编译时异常。常见的异常:RuntimeException运行时异常:1、空指针异常NullPointerException引用类型对象为null,输出该对象。2、数组角标越界异常ArrayIndexOutOfBoundsException输出数组
2021-09-01 14:56:21
122
原创 一些常用类
String类:1、String声明为final,表示不可被继承;2、String实现了Serializable接口,表示可以被序列化;实现了Comparable接口,表示可以相互比较大小。3、String内部定义了final byte[] values属性来存储字符串数据(jdk1.8及以前String使用的是char数组,jdk1.9及以后使用的是byte数组);4、通过字面量的方式新建字符串,变量直接指向字符串常量池。字符串数据存储在常量池中,且常量池中不会存在相同的字符串数据,即相同
2021-09-01 14:55:56
129
原创 注解相关笔记
注解:注解(Annotation)可以像修饰符一样被使用,可用于修饰包,类,构造器,方法,成员变量,参数,局部变量的声明。注解(Annotation)的属性,用无参数无语句方法的形式来声明。其方法名和返回值定义了该成员的名字和类型,我们称为配置参数。方法的返回类型只能是八种基本数据类型、String类型、Class类型、enum类型、Annotation类型或上述12种类型的数组。自定义注解:1、用@interface表示注解。 @interface MyA...
2021-09-01 14:54:49
76
原创 泛型相关笔记
泛型的概念所谓泛型, 就是允许在定义类、 接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型或者是构造器参数类型(注意是为了让属性或方法或构造器类型变得可替换)。 这个类型参数将在使用时(例如,继承或实现这个接口, 用这个类型声明变量、 创建对象时) 确定(即传入实际的类型参数, 也称为类型实参)。JDK7新特性:类型推断▲泛型的类型不能为基本数据类型集合中的泛型JDK1.5改写了集合框架中的全部接口和类, 为这些接口、 类增加了泛型...
2021-09-01 14:54:21
109
原创 IO流相关笔记
File类1、File类的一个对象代表一个文件或一个文件目录(即文件夹)。2、File 能新建、删除、重命名文件和目录,但 File 不能访问文件内容本身。如果需要访问文件内容本身,则需要使用输入/输出流来完成。3、想要在Java程序中表示一个真实存在的文件或目录,那么必须有一个File对象,但是Java程序中的一个File对象,可能没有一个真实存在的文件或目录。 4、File对象常作为参数传递给流的构造器 File类构造器新建文件要加文件相应的后缀!public File.
2021-09-01 14:53:42
171
原创 关于bio
cs模型String类关于字节的构造方法客户端socket实现服务器实现服务器端用serversocket的accept方法获取连接的客户端的socket,用客户端socket中的输入输出流方法来读取和发送只从客户端上传数据到服务器端客户端实现服务器端实现(节点流写出时不用判断)注意:此时上面的系统有问题,因为1、服务器调用accept方法后会一直等待客户端传输,相当...
2021-08-30 14:37:36
123
原创 RPC框架的组成
RPC自定义私有协议整个协议就会拆分成两部分:协议头和协议体。协议头是由一堆固定的长度参数组成,而协议体是根据请求接口和参数构造的,长度属于可变的,具体协议如下图所示为了保证能平滑地升级改造前后的协议,我们有必要设计一种支持可扩展的协议。其关键在于让协议头支持可扩展,扩展后协议头的长度就不能定长了。那要实现读取不定长的协议头里面的内容,在这之前肯定需要一个固定的地方读取长度,所以我们需要一个固定的写入协议头的长度。整体协议就变成了三部分内容:协议头固定部分、协议头扩展部分、协议体内容,前..
2021-08-30 13:50:49
827
原创 关于netty框架
目录使用Netty的通信流程eventloop/eventloopgroup(每一个loop相当于NIO中的多线程多路复用中的单个worker)channelFuture和promiseHandler和pipelineBytebufbytebuf的零拷贝和netty的零拷贝粘包和半包现象使用Netty的通信流程服务器端接收数据客户端发送数据整体流程注意12步调用初始化方法只是为了添加各自的handler处理器但并不调用。..
2021-08-30 13:45:10
235
原创 关于aio
AIO 是异步非阻塞同步意味着,在进行读写操作时,线程需要等待结果,还是相当于闲置异步意味着,在进行读写操作时,线程不必等待结果,而是将来由操作系统来通过回调方式由另外的线程来获得结果AIO的read方法有四个参数,bytebuffer,起始位置,附件,回调对象,如果read成功则会由其他线程使用回调对象的回调方法返回结果。默认文件 AIO 使用的线程都是守护线程,所以要让主线程持续运行以避免守护线程意外结束...
2021-08-30 13:41:50
88
原创 nio相关
写入和读出的问题任何情况下,对一个区域来说都是写入,读出。IO流的read是流的方法,对流来说是读出,而不是对内存来说是读入。同理,bytebuffer也是,调用的channel的read方法对channel来说是读出,而不是针对bytebuffer是读入,对bytebuffer来说是写入。注意:BIO,NIO,AIO都是网络编程,不是文件编程NIO可以工作在阻塞和非阻塞模式下NIO三大组件(Channel):channel 有一点类似于 stream,它就是读写数据的...
2021-08-30 13:41:21
118
原创 IOC和XML文件
目录IOC控制反转/依赖注入XML文件的配置IOC控制反转/依赖注入以前是直接创建一个属性/依赖类,如果我们依赖于某个类或服务,最简单而有效的方式就是直接在类的构造函数中新建相应的依赖类。但是在IOC中,所有的被注入对象和依赖对象现在由IoC Service Provider统一管理。从被注入对象的角度看,与之前直接寻求依赖对象相比,依赖对象的取得方式发生了反转,控制也从被注入对象转到了IoC Service Provider那里Spring的IoC容器就是.
2021-08-28 17:03:13
191
原创 容器的启动和实例化
Spring的IoC容器实现以上功能的过程,基本上可以按照类似的流程划分为两个阶段,即容器启动阶段和Bean实例化阶段启动阶段:由refresh()方法启动(这个方法在IoC容器的具体实现类的构造函数中),启动包括1、BeanDefinition的Resource定位(获取资源位置的Resource对象)构造IoC容器时,需要指定BeanDefinition的信息来源(如从xml文件中来),而这个信息来源需要封装成spring中的Resource类来进行IO操作。Resourc.
2021-08-28 17:01:23
276
原创 AOP的总结
AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块。AOP的作用是把那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。将重复的代码抽取出来(不同的模块),在需要时统一调..
2021-08-28 16:59:58
137
原创 TCP/IP
目录链路层网络层IP协议传输层UDP与TCPTCP的连接和释放流量控制机制拥塞控制机制链路层TCP/IP支持多种不同的数据链路协议,这取决于网络所使用的硬件,如以太网、令牌环网、FDDI、RS-232串行线路等,当今TCP/IP采用的主要局网技术是以太网。以太网的帧结构帧数据的发送方式以“广播”的方式在子网络内的主机之间传输。广播就是它不是把帧数据准确送到接收方,而是向本网络内所有计算机发送,每台计算机根据收到的帧数据的标头的MA...
2021-08-27 22:34:51
243
原创 HTTP的一些总结
目录报文报文方法响应报文的状态码中转服务器HTTPS报文报文用于 HTTP 协议交互的信息被称为 HTTP 报文。 请求端(客户端) 的HTTP 报文叫做请求报文, 响应端(服务器端) 的叫做响应报文 请求报文请求报文分为报文首部,空行,报文主体。报文首部分为请求行,首部字段,其他请求行分为请求方法,请求URI,http协议版本;首部字段分为请求首部字段,通用首部字段,实体首部字段报文主体使用键值对的形式...
2021-08-27 22:30:03
214
原创 并发的基础
程序、进程和线程:进程:是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程。线程:是进程的一个实体,是 cpu 调度和分派的基本单位,是比程序更小的能独立运行的基本单位。一个线程就是一个指令流,将指令流中的一条条指令以一定的顺序交给 CPU 执行 。单核CPU,其实是一种假的多线程,因为在一个时间单元内,也只能执行一个线程的任务。如果是多核的话,才能更好的发挥多线程的效率。一个Java应用程序java.exe,其实至少有三个线程:main()主线...
2021-08-27 22:22:12
218
原创 线程的创建
线程的创建和启用:创建新线程的方法:1、继承Thread类Thread类的特性:1、每个线程都是通过某个特定Thread对象的run()方法来完成操作的,经常把run()方法的主体称为线程体。2、通过该Thread对象的start()方法来启动这个线程,而非直接调用run()。步骤:1、定义子线程类继承Thread类。2、子线程类中重写Thread类中的run方法。3、创建Thread子线程类对象。4、调用子线程对象start方法:①启动新线程;②调用当前线程r.
2021-08-27 22:21:41
298
原创 线程的状态
线程的状态:操作系统层面5种:新建:当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建状态就绪:处于新建状态的线程被start()后,将进入线程队列等待CPU时间片,此时它已具备了运行的条件,只是没分配到CPU资源。运行:当就绪的线程被调度并获得CPU时间片资源时,便进入运行状态,run()方法定义了线程的操作和功能。阻塞:在某种特殊情况下,被人为挂起或执行输入输出操作时,让出CPU时间片调度并临时中止自己的执行,进入阻塞状态。死亡:线程完成了它的全部工作或线程
2021-08-27 22:21:08
89
原创 线程的同步
线程的同步:1、线程安全问题:当多个线程对具有共享变量的多个语句执行写操作时(不能只看成执行同一个run方法,也可能在不同的run方法也有共享变量)时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程就开始执行。导致共享数据(共同操作的变量)的错误。3、解决办法:对多条操作共享数据的语句,只能让一个线程都执行完,在执行过程中,其他线程不能执行。对共享变量进行写入时,结果要正确,必须保证是原子操作。原子操作是指不能被中断的一个或一系列操作。①阻塞式:synchronized,LOCK锁,
2021-08-27 22:20:39
77
原创 线程的通信
可以在synchronized关键字下使用:使用wait/notify线程通信:wait/notify的原理如下锁对象.wait():让该线程进入Monitor的WaitSet中,并释放当前锁。调用此方法后,当前线程将释放对象监控权 ,然后进入等待WAITING状态。在当前线程被notify后会立刻进入Monitor的EntryList中处于BLOCLED状态,等待锁的释放然后重新竞争锁,竞争成功后从断点处继续代码的执行。用if判断的话,唤醒后线程会从wait之后的代码开始运行,但是不会重新
2021-08-27 22:19:59
76
原创 Synchronize锁原理
synchronized修饰代码块每个 Java 对象都可以关联一个 Monitor 对象,Monitor对象由jvm提供。当字节码指令执行到monitorenter 指令时,该java对象的对象头mark word指向一个Monitor ,此时该对象可以作为锁,计数器+1。当执行到monitorexit 指令时,计数器-1。当计数器为0时说明没有重入,释放锁!!!!!!!!!!!!!!这也是synchronized的可重入原理。以上是成功获取锁的情况,在Monitor底层中,如果Mon
2021-08-27 22:18:56
183
原创 JMM和内存问题
JMM java内存模型,JMM 的主要目的是定义程序中各种变量的访问规则, 以实现让Java程序在各种平台下都能达到一致的内存访问效果。JMM 规定所有实例变量和静态变量都存储在主内存,每条线程有自己的工作内存,工作内存中保存被该线程使用的变量的主内存副本,线程对变量的所有操作都必须在工作空间进行,不能直接读写主内存数据。不同线程间无法直接访问对方工作内存中的变量,线程通信必须经过主内存。主内存:我们常说的物理内存,共享变量(实例变量,静态变量)都存储在主内存中 。工作内存:指每个.
2021-08-27 22:17:19
246
原创 关于线程池
JDK中提供的线程池ThreadPoolExecutor和ScheduledExecutorService创建线程池的几种方法线程池的常用创建方式主要有两种,通过Executors工厂方法创建(内部调用了ThreadPoolExecutor)和直接newThreadPoolExecutor方法创建。线程池的工作流程线程池中刚开始没有线程,当一个任务提交给线程池后,线程池会创建一个新线程来执行任务。当线程数达到 corePoolSize ...
2021-08-25 11:45:35
754
原创 CAS乐观锁
CAS乐观锁:该操作由sun.misc.Unsafe类里面的compareAndSwapInt()和compareAndSwapLong()和compareAndSwapObject()等几个方法包装提供。J.U.C包里面的原子类, 例如compareAndSet()和getAndIncrement()等方法都使用了Unsafe类的CAS操作来实现。 CAS是比较并交换由Unsafe类的compareAndSwap方法提供,能保证修改变量操作的原子性。底层是 lock cmpxchg 指令(X.
2021-08-25 11:44:05
879
原创 JUC Reentrantlock原理
AQS是什么?AbstractQueuedSynchronizer,是一个抽象类,称之为同步器,分为sync,fairsync和nofairsync。是lock式锁加锁和解锁真正用到的框架。特点?1、AQS中用 state 属性来表示是否上锁,在Reentrantlock中0表示没有上锁,大于0表示重入了几次锁。在ReentrantReadWriteLock中state分为读状态和写状态2、提供了基于 FIFO 的虚拟队列,类似于 Monitor 的 EntryList3、内..
2021-08-25 11:43:32
99
原创 JUC 读写锁原理
读写锁当前线程获取读锁后,自身线程可以获取读锁不能获取写锁,其他线程可以获取读锁不能获取写锁,尝试获取锁的线程会进入阻塞队列,直到读锁释放。当前线程获取写锁后,自身线程可以获取读锁和写锁,其他线程不可以获取读锁和写锁。尝试获取锁的线程会阻塞,直到写锁释放。锁降级先获取写锁,再获取读锁,在读锁中把写锁释放,称为锁降级state读写状态和写状态和读状态读写锁的state高16位存放读状态,即每获取一次读锁,高16位加1,即加的是0x00010000,低16位写状态,即每...
2021-08-25 11:42:14
187
原创 JUC StampedLock
StampedLock当前线程获取读锁后,自身线程不能获取写锁,其他线程可以获取读锁不能获取写锁,尝试获取锁的线程会进入阻塞队列,直到读锁释放。当前线程获取写锁后,自身线程可以获取读锁,其他线程不可以获取读锁和写锁。尝试获取锁的线程会阻塞,直到写锁释放。使用StampedLock的原因?采用乐观读,能进一步优化读性能。它的特点是在使用读锁、写锁时都必须配合印章使用 StampedLock的缺点:不支持可重入;不支持条件变量StampedLock的使用过程在执...
2021-08-25 11:41:07
91
原创 关于性能调优
Linux系统调优调优步骤衡量系统现状:包括系统的请求次数,响应时间,资源消耗等设定调优目标:寻找性能瓶颈:资源消耗主要集中在CPU,文件IO,网络IO,内存CPU消耗分析:CPU主要用于中断,内核,用户进程的处理上下文切换,运行队列,利用率的概念对于java应用,CPU消耗严重通常体现在us用户进程和sy内核上us:us高表示应用消耗了大量CPU,Java应用造成us高的原因一是线程一直处于可运行的状态,没有任何挂起动作,二是频繁的GCsy:sy高表
2021-08-25 11:32:36
124
原创 关于字节码执行引擎
在不同的虚拟机实现中, 执行引擎在执行字节码的时候, 通常会有解释执行(通过解释器执行)和编译执行(通过即时编译器产生本地代码执行) 两种选择,也可能两者兼备栈中首先都是线程,每个线程启动后,虚拟机就会为其分配一块栈内存。栈帧栈帧是用于支持虚拟机进行方法调用和方法执行背后的数据结构,一个方法对应一个栈帧,每一个方法从调用开始至执行结束的过程, 都对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程。它也是虚拟机运行时数据区中的虚拟机栈的栈元素;每一个栈帧都包括了局部变量表、 操作数栈、 动态连接、
2021-08-25 11:32:00
120
原创 关于类加载机制需要注意的问题
什么是类加载机制?类加载和类型的加载不同。类加载机制的5个阶段?这些阶段通常都是互相交叉地混合进行的。解析阶段的顺序可能在初始化之后。 类的初始化阶段有且只有六种主动引用情况1、遇到new、 getstatic、 putstatic或invokestatic这四条字节码指令时使用new关键字实例化对象的时候读取或设置一个类型的静态字段调用一个类型的静态方法的时候2、进行反射调用的时候3、当初始化类的时候, 如果发现其父类还没有进行过初始化 4、指定一个要执行的主类( 包含
2021-08-25 11:31:22
165
原创 CLASS文件的结构
平台无关性和语言无关性的基石都是虚拟机和字节码存储格式。Class文件格式只有两种数据类型: “无符号数”和“表” ,一个Class文件只代表一个类或者接口魔数是什么,作用?版本号,第5和第6个字节是次版本号 , 第7和第8个字节是主版本号常量池入口,u2类型的数据, 代表常量池容量计数值,该计数值包括了0号常量,但我们使用的常量索引从1而不是0开始。为什么要设置0号常量?Class文件常量池包含了字面量和符号引用,什么是字面量,什么是符号引用?classinfo表由两部分组成?UTF.
2021-08-25 11:30:21
71
原创 有关垃圾回收需要注意的问题
经典的垃圾收集器▲新老生代垃圾收集器关系图▲serial/serial old收集器框图,线程,各采用什么算法;serial收集器客户端默认收集器,好处是▲ParNew收集器实质上是Serial收集器的多线程并行版本,采用什么算法;ParNew收集器在JDK9之前的作用是和CMS配合,是默认的服务端收集器; ParNew收集器和serial收集器的对比▲Parallel Scavenge收集器和ParNew收集器相似,算法是,区别为其特点是关注点不同和自适应调节策略 ;吞吐量是什么,高吞吐量
2021-08-25 11:28:07
122
原创 关于并发编程一些总结
目录并发编程概述线程的创建和启用线程的状态线程的同步线程的通信synchronized的原理(重量)synchronized原理(轻量,偏向,无锁)JMM内存问题和可见性有序性CAS操作与原子整数线程池相关JUC ReentrantLock原理JUC 读写锁原理并发编程概述程序、进程和线程:进程:是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程。线程:是进程的一个实体,是 cpu 调度和分派的基本单位,
2021-08-22 18:06:27
225
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人