
Java
文章平均质量分 84
刘小豆豆豆
路漫漫其修远兮,吾将上下而求索!
展开
-
基于NIO的网络通信框架——Netty
6、Netty什么是Netty?Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架。1)本质:JBoss做的一个Jar包2)目的:快速开发高性能、高可靠性的网络服务器和客户端程序3)优点:提供异步的、事件驱动的网络应用程序框架和工具通俗的说:一个好使的处理Socket的框架Netty是一款基于NIO(Nonblocking I/O,非阻塞IO)开发的网络通信框架,对比于BIO(Blocking I/O,阻塞IO),他的并原创 2021-03-28 15:39:55 · 780 阅读 · 1 评论 -
IO多路复用之select、poll、epoll
IO多路复用之select、poll、epoll**IO多路复用是指内核一旦发现线程指定的一个或者多个IO条件准备读取,它就通知该进程。**当客户处理多个描述符时(一般是交互式输入和网络套接口),必须使用I/O复用。与多进程和多线程技术相比,I/O多路复用技术的最大优势是系统开销小,系统不必创建进程/线程,也不必维护这些进程/线程,从而大大减小了系统的开销。目前支持I/O多路复用的系统调用有 select,pselect,poll,epoll,I/O多路复用就是通过一种机制,一个进程可以监视多个描述符原创 2021-03-28 14:48:06 · 348 阅读 · 0 评论 -
网络编程之NIO模型
1、阻塞与非阻塞阻塞与非阻塞是描述进程在访问某个资源时,数据是否准备就绪的的一种处理方式。当数据没有准备就绪时:阻塞:线程持续等待资源中数据准备完成,直到返回响应结果。非阻塞:线程直接返回结果,不会持续等待资源准备数据结束后才响应结果。2、同步与异步同步与异步是指访问数据的机制,同步一般指主动请求并等待IO操作完成的方式。异步则指主动请求数据后便可以继续处理其它任务,随后等待IO操作完毕的通知。老王烧开水:1、普通水壶煮水,站在旁边,主动的看水开了没有?同步的阻塞2、普通水壶煮水,原创 2021-03-28 11:30:27 · 569 阅读 · 0 评论 -
深入了解Spring及SpringBoot自动装配、循环依赖问题
文章目录1、什么是 Spring 框架?2、列举一些重要的Spring模块?3、 @RestController vs @Controller4、 Spring IOC & AOP谈谈自己对于 Spring IoC 和 AOP 的理解1、IoC、DI2、IOC用到哪些设计模式?工厂模式单例模式策略模式AOPSpring AOP 和 AspectJ AOP 有什么区别?5、Spring beanSpring 中的 bean 的作用域有哪些?Spring 中的单例 bean 的线程安全问题了解吗?@Co原创 2021-03-27 16:42:56 · 1105 阅读 · 0 评论 -
Synchronized锁
Synchronized1.1 原子性所谓原子性就是指一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。在Java中,对基本数据类型的变量的读取和赋值操作是原子性操作,即这些操作是不可被中断的,要么执行,要么不执行。但是像i++、i+=1等操作字符就不是原子性的,它们是分成读取、计算、赋值几步操作,原值在这些步骤还没完成时就可能已经被赋值了,那么最后赋值写入的数据就是脏数据,无法保证原子性。被synchronized修饰的类或对象的所有操作都是原子的,因为在执行操作原创 2021-03-23 20:40:45 · 138 阅读 · 0 评论 -
LockSupport
LockSupport用于创建锁和其他同步类的基本线程阻塞原语。LockSupport其实就是对线程等待唤醒机制(wait/notify)的改良版。什么是LockSupport?通过park()和unpark(thread)方法来实现阻塞和唤醒线程的操作LockSupport是一个线程阻塞工具类,所有的方法都是静态方法,可以让线程在任意位置阻塞,阻塞之后也有对应的唤醒方法。归根结底,LockSupport调用的Unsafe中的native代码。官网解释:LockSupport是用来创建锁和其他原创 2021-03-23 18:39:10 · 103 阅读 · 0 评论 -
IOC与AOP及相关设计模式
IOC/DI1、什么是IOC、DI?IOC:Inversion of Control —— 控制反转【注意:这是一种思想】DI:Dependency Injection —— 依赖注入其实这两个概念本质上是没有区别的,DI可以看作是IOC思想的一种实现。假设这么一个场景:在A类中调用B类的方法,那么我们就称 A依赖B,B为被依赖(对象),相信这点大家能够理解。传统做法:(1)直接在A(方法)中new出B类对象,然后调用B类方法 —— 硬编码耦合;(2)通过简单工厂获取B类对象,然后调用B类原创 2021-03-23 17:02:53 · 1866 阅读 · 0 评论 -
注解与反射概述
注解Annotation什么是注解?注解,顾名思义,注解,就是对某一事物进行添加注释说明,会存放一些信息,这些信息可能对以后某个时段来说是很有用处的。Java注解又叫java标注,java提供了一套机制,使得我们可以对方法、类、参数、包、域以及变量等添加标准(即附上某些信息)。且在以后某个时段通过反射将标注的信息提取出来以供使用。Annotation 是从 JDK 1.5 开始引入的新技术Annotation 的作用不是程序本身,可以对程序作出解释(这一点和注释没什么区别)可以被其它程序(原创 2021-03-23 15:45:11 · 163 阅读 · 0 评论 -
JVM基本参数调优
JVM参数调优1、JVM的标配参数和X参数JVM的参数类型:标配参数java -versionjava -help-后不能由空格X参数(了解)-Xint():解释执行-Xcomp :第一次使用就编译成本地代码-Xmixed:混合模式XX参数下文再讲:2、XX类型参数之布尔类型:公式:-XX:+ 或者 - 某个属性值(+表示开启,-表示关闭)如何查看一个正在运行中的java程序,它的某个jvm参数是否开启?具体值是多少?jps -l (类似于Lin原创 2021-03-22 22:14:44 · 353 阅读 · 0 评论 -
JVM中的强引用、软引用、弱引用以及虚引用
强软弱虚引用:前言在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于(reachable)可达状态,程序才能使用它。从JDK 1.2版本开始,对象的引用被划分为4种级别,从而使程序能更加灵活地控制对象的生命周期。这4种级别由高到低依次为:强引用、软引用、弱引用和虚引用。1、强引用(StrongReference)强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。如下:Object strongReference原创 2021-03-22 21:14:57 · 515 阅读 · 0 评论 -
JVM中如何确定哪些对象被回收?(枚举根节点做可达性分析)
如何确定哪些对象是否可以被回收?1.引用计数法。上文提到了,引用一次计数加1,取消引用则减一,等到为0时等待被回收,现已不被使用。2.枚举根节点做可达性分析:目前主流的商用JVM都是通过可达性分析来判断对象是否可以被回收的。这个算法的基本思路是:通过一系列被称为「GCRoots」的根对象作为起始节点集,从这些节点开始,通过引用关系向下搜寻,搜寻走过的路径称为「引用链」,如果某个对象到GCRoots没有任何引用链相连,就说明该对象不可达,即可以被回收。那么什么是对象可达?GC Roots是原创 2021-03-22 21:11:52 · 689 阅读 · 0 评论 -
深入理解GC(分代收集算法)垃圾回收
GC(分代收集算法)垃圾回收JVM在进行GC时,并非每次都对上面三个内存区域一起回收,大部分时候回收的都是指新生代。因此GC按照回收的区域又分了两种类型, 一种是普通GC(Minor GC),一种是全局GC(major GC or Full GC)。MinorGC 和Full GC的区别普通GC(minor GC):只针对新生代区域的GC,指发生在新生代的垃圾回收动作,因为大多数Java对象存活率都不高,所以Minor GC非常频繁,一般回收速度也比较快。全局GC(major GC or Full原创 2021-03-22 16:00:56 · 1276 阅读 · 1 评论 -
深入理解JVM中的栈和堆
深入理解栈栈又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把 另一端称为栈底。其特性是先进后出。栈是线程私有的,生命周期跟线程相同,当创建一个线程时,同时会创建一个栈,栈的大小和深度都是固定的。方法参数列表中的变量,方法体中的基本数据类型的变量和引用数据类型的引用都存放在栈中,成员变量和对象本身不存放在栈中。运行时,成员函数的局部变量引用也存放在栈中。栈的变量随着变量作用域的结束而释放,不需要jvm垃圾回收机制回收。栈原创 2021-03-21 22:46:25 · 909 阅读 · 0 评论 -
初探JVM(JVM入门)
JVM初探1、JVM的位置及体系结构JVM的位置JVM的体系结构本地方法接口:JNI(Java Native Interface)2、堆(Heap)和栈(Stack)JAVA在程序运行时,在内存中划分5片空间进行数据的存储。分别是:1:寄存器。2:本地方法区。3:方法区。4:栈。5:堆。栈(Stack)内存用于存放基本类型的变量 (8种) 和对象的**引用变量(注意是引用变量)**以及实例的方法,用完就消失(栈的特性,先进后出)。当在一段代码块中定义一个变量时,java就在栈中为这个原创 2021-03-21 22:39:28 · 199 阅读 · 0 评论 -
Java线程池工作原理、拒绝策略以及自定义线程池详解
线程池为什么用线程池线程池做的工作主要是控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量,超出数量的线程排队等候,等其他线程执行完毕,再从队列中取出任务来。主要特点为:线程复用、控制最大并发数,管理线程。降低资源消耗,通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度,当任务到达时,任务可以不需要等到线程创建(已经创建好了)就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的原创 2021-03-20 21:12:33 · 593 阅读 · 0 评论 -
线程池预热之Callable
Callablecallable和Runnable的区别是callable可以有返回值,也可以抛出异常的特性,Callable实现多线程: 将实现Callable接口的实现类丢尽FutureTask 中,然后再将futureTask放进Thread类中,用到了适配者模式,面向接口的编程(参数都是接口,因为一个类可以实现多个接口,因此实现了其接口的类都有作为参数)。 注意:多个线程抢一个FutureTask,只计算一次call里的内容,想要计算多次需要起多个FutureTask。public c原创 2021-03-20 21:06:40 · 854 阅读 · 0 评论 -
AQS及ReentrantLock的底层原理
写在前面,本文受启与养兔子的大神,并在他文章的基础上添加了一些自己的理解。AQS(Abstract Queued Synchronzied)AQS的底层其实就是 “操作系统基础” 中的状态量和锁的V-P操作。AQS就是JDK中为“线程同步”提供的一套基础工具类,其实就是一个类而已,其上文讲到的同步组件(CountDownLatch,CyclicBarrier,Semaphore)(因此AQS就成了非常重要的一个知识点,因为基于它可以写出JAVA中的很多“锁”类。比如此文要分析的ReentrantLoc原创 2021-03-20 11:29:57 · 440 阅读 · 0 评论 -
阻塞队列(BlockingQueue)实现生产消费模式并手写一个阻塞队列
阻塞队列(BlockingQueue)什么是阻塞队列?阻塞队列 是一种数据结构,它是一个队列,可以存放0到N个元素。我们可以对这个队列执行插入或弹出元素操作,弹出元素操作就是获取队列中的第一个元素,并且将其从队列中移除;而插入操作就是将元素添加到队列的末尾。当队列中没有元素时,对这个队列的弹出操作将会被阻塞,直到有元素被插入时才会被唤醒;当队列已满时,对这个队列的插入操作就会被阻塞,直到有元素被弹出后才会被唤醒。在线程池中,往往就会用阻塞队列来保存那些暂时没有空闲线程可以直接执行的任务,等到线程空闲之原创 2021-03-19 21:59:07 · 322 阅读 · 0 评论 -
Condition的signal()和Synchronized的notiy()的区别,一文弄懂!
Condition的signal()和Synchronized的notiy()的区别,一文弄懂!Condition中的 await() 方法相当于 Object 的 wait() 方法,Condition中的 signal() 方法相当于Object的notify()方法,Condition中的 signalAll() 相当于Object的notifyAll()方法。不同的是,Object中的这些方法是和同步锁捆绑使用的;而Condition是需要与互斥锁/共享锁捆绑使用的。Condition它原创 2021-03-19 18:59:59 · 538 阅读 · 0 评论 -
Synchronized 与Lock(ReentrantLock)区别
Synchronized 与Lock(ReentrantLock)区别:原始构成sync 是关键字属于JVM层面,monitorenter(底层是通过monitor对象来完成,其实wait/notify等方法也依赖于monitor对象,只有在同步代码块或方法中才能调用wait/notify等方法)Lock 是具体类(JUC包下的)是API层面的锁。使用方法:synchronized 不需要用户去手动释放锁,当synchronized代码执行完成后系统会自动让线程释放对锁的占用原创 2021-03-19 18:53:39 · 323 阅读 · 0 评论 -
CountDownLatch / CyclicBarrier /Semaphore
CountDownLatch 工作原理CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量;调用await()方法的线程会被阻塞,直到计数器 减到 0 的时候,才能继续往下执行。调用了await()进行阻塞等待的线程,它们阻塞在Latch门闩/栅栏上;只有当条件满足的时候(countDown() N次,将计数减为0),它们才能同时通过这个栅栏;以此能够实现,让所有的线程站在一个起跑线上。CountDownLatch 的源码在JUC并发工具中,也相对算是简单的;底层基于 A原创 2021-03-19 11:15:00 · 176 阅读 · 0 评论 -
Java锁之公平锁/可重入锁/读写锁/自旋锁
Java锁在java中,锁是实现并发的关键组件,多个线程之间的同步关系需要锁来保证,所谓锁,其语义就是资源获取到资源释放的一系列过程,使用lock的意图就是想要进入临界区对共享资源执行操作,使用unlock说明线程已经完成了相关工作或者发生了异常从而离开临界区释放共享资源,可以说,在多线程环境下,锁是一个必不可少的组件。我们最为常用的并发锁是synchronized关键字,在最新的jdk中,synchronized的性能已经有了极大的提升了,而且未来还会对它做更进一步的优化,最为重要的是synchroni原创 2021-03-18 21:54:35 · 299 阅读 · 1 评论 -
线程不安全集合类源码剖析及解决方案
线程不安全集合类及源码剖析:常用的线程不安全集合:ArrayListLinkedListArraySetHashMap不安全集合之List1.ArrayList举一个List线程不安全的例子: 开10个线程对List进行添加并访问。public static void main(String[] args) { //新建一个ArrayList集合 List<String> strings = new ArrayList<>(); for原创 2021-03-18 15:30:11 · 139 阅读 · 0 评论 -
CAS实现原理、Atomic类以及ABA问题
CAS是什么?compareAndSwapCAS全称为Compare - And -Swap ,它是一条CUP并发原语。CAS 被认为是一种乐观锁。Java中CAS操作的执行依赖于Unsafe类的方法。它的功能是判断内存某个位置的值是否为预测值,如果是则更改为新的值,这个过程是原子的 ,volatile可以跟CAS配合保证原子性。CAS并发原语体现在Java语言就是sun.misc.Unsafe类中的各个方法,调用Unsafe类中的CAS方法,JVM就会帮我们实现出CAS汇编指令。这是一种完全依赖于硬原创 2021-03-17 19:10:17 · 168 阅读 · 0 评论 -
Volatile的可见性、不保证原子性、指令重排及JMM分析
1.volatilevolatile 是Java虚拟机提供的轻量级(轻量级synchronized)的同步机制。volatile 的特性:保证可见性:JMM内存模型中(下文),如果线程A将工作内存的变量修改后写入主内存中,要保证线程B拷贝主内存的变量值是最新值。如何保证可见性:volatile 关键字通过内存屏障禁止了指令的重排序,并在单个核心中,强制数据的更新及时更新到缓存。在此基础上,依靠多核心处理器的缓存一致性协议等机制**,保证了变量的可见性。分析如下一段代码,明白什么是可见性。原创 2021-03-17 10:21:16 · 197 阅读 · 0 评论 -
多线程详解——下(线程通信、线程池)
线程协作生产者消费者模式应用场景:假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库,消费者将仓储中产品取走。如果仓库中没有产品,则生产者将产品放入仓库,否则停止生产并等待,直到仓库中的产品没有被消费者取走为止。如果仓库中放有产品,则消费者可以将产品取走消费,否则停止消费并等待,直到仓库中再次放入产品为止。分析:这是一个线程同步的问题,生产者消费者共享同一个资源,并且生产者和消费者之间互相依赖,互为条件。对于生产者,没有生产产品之前,要通知消费者等待,而生产了产品之后,又需要马上通知原创 2021-02-17 14:04:49 · 130 阅读 · 0 评论 -
多线程详解——中(线程状态、线程同步)
3.线程状态线程方法:setPriority(int newPriority) 更改线程的优先级。static void sleep(long millis) 在指定的毫秒数内让当前正在执行的线程体休眠。void join()等待改线程终止static void yield() 暂停当前正在执行的线程对象,并执行其他线程void interrupt() 中断线程 (不建议使用)boolean isAlive() 测试线程是否处于活动状态停止线程:不推荐使用JDK提供的stop()、原创 2021-02-04 20:32:41 · 276 阅读 · 2 评论 -
多线程详解——上(线程简介、线程实现)
Java.Thread。1.线程简介程序.进程.线程。 在操作系统中运行的程序就是进程,比如QQ、播放器、游戏等等。一个进程中可以有多个线程,如视频中同时听到声音,看到画面、弹幕等等。 程序: 程序是指令和数据的有序集合、其本身没有任何运行的含有,是一个静态的概念。 进程:执行程序的一次执行过程,它是一个动态的概念。是系统资源分配的单位。 通常在一个进程中可以包含多个线程,当然一个进程中至少包含一个线程, 不然没有存在的意义,线程是CUP调度和执行的单位。 注意: 很多多线程是模拟出原创 2021-01-26 19:57:59 · 125 阅读 · 0 评论 -
TypeError解决策略 及SpringBoot项目Http站点改为Https
SpringBoot Http站点改为Https背景:本地调用摄像头时正常,但部署到线上时页面出现:TypeError: Cannot read property ‘getUserMedia’ of undefined ,此错误可以通过设置浏览器来解决,但是比较复杂。通过查阅Web API发现:发现该问题与浏览器的安全策略有关。出于安全考虑,浏览器是不允许随便开启摄像头的,https协议下方可开启。而我的服务恰好是http协议的,后将站点访问改为https协议后,便可正常调用摄像头了。Htt原创 2020-09-24 04:42:10 · 260 阅读 · 0 评论 -
基于JMQTT的服务器(broker)开发
MQTT代理(服务器开发) 本例将基于JMQTT进行二次开发作为MQTT代理。由于JMQTT需要配置启动环境变量,比较麻烦并且对初学者不利,环境变量是为了系统运行更快而设置的,jmtqq不是频繁读取系统变量,故将其屏蔽掉。 本MQTT服务器绕过了环境变量设置,系统自动建立运行所需的配置文件,但需要创建一下两个类进行配置。JMQTT功能特性基于Java及Netty开发,插件化模式,高性能,高扩展性。支持mqtt协议qos0,qos1,qos2消息质量服务。支持mqtt协议c原创 2020-08-01 17:02:38 · 1190 阅读 · 2 评论 -
消息传输协议MQTT入门以及协议解析
文章目录MQTT简介MQTT中的概念发布/订阅模式主题服务质量消息类型**MQTT**数据包解析1、数据包结构2、MQTT固定头3、MQTT可变头4、Payload消息体MQTT简介 MQTT是基于二进制消息的发布/订阅编程模式的消息协议,由IBM公司开发,主要用于轻量级的订阅/发布式的消息传输。其设计目的主要是为低带宽和不稳定网络环境下的物联网设备提供服务。MQTT的应用场景:特别适合于网络代价昂贵,带宽低、不可靠的环境。能在处理器和内存资源有限的嵌入式设备中运行。使用发布/订阅消息原创 2020-08-01 16:54:39 · 1328 阅读 · 0 评论 -
Mybatis入门、配置及搭建增删改查demo
Mybatis1. 简介1.1 什么是Mybatis MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。配置Mybatis:将 mybatis-x.x.x.jar 文件置于类路径(classpat原创 2020-06-06 15:54:48 · 233 阅读 · 0 评论 -
SpringBoot整合Mybatis进行数据持久化
1.SpringBoot构建已经Maven工程搭建选择依赖:将Web内的Spring Web导入2.修改配置文件:使用yml语法将application.properties文件删除,创建application.yml配置文件(备注:其实SpringBoot底层会把application.yml文件解析为*application.properties*)application.ymlspring: profiles: active: devapplication-dev.yml原创 2020-06-06 15:52:29 · 591 阅读 · 0 评论 -
java.lang.NoClassDefFoundError: Lorg/apache/log4j/Logger报错
检查是否导入jar包,maven依赖。若成功导入,Tomcat仍然无法启动检查Tomcat中是否导入log4j的包, 没有则去可能是tomcat找不到mysql jar包的问题。把logj4.jar导入到tomcat的lib目录下面打开tomcat设置——Configuer…——Libraries —— tomcat的lib目录下面找到logj4.jar添加上即可...原创 2020-03-21 17:14:56 · 1299 阅读 · 0 评论 -
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
查看数据库驱动是否添加到lib目录没有则去添加数据库jar包到lib若问题依旧没有解决:确认包已经导入 web目录可能是tomcat找不到mysql jar包的问题。后来又把mysql-connector-java-5.0.7-bin.jar导入到tomcat的lib目录下面就可以了打开tomcat设置——Configuer…——Libraries —— 添加数据库驱动的jar包在...原创 2020-03-21 16:05:32 · 190 阅读 · 0 评论 -
Servlet_JSP详解
文章目录Servlet1. Servlet运行流程:2. Servlet配置:3. doGet/doPost的区别与使用:4. Request1.概述2.常用方法(1) 域方法:(2) 获取请求头数据:(3) 获取请求相关的其他方法3)常用方法总结:4.request获取请求参数获取请求参数的通用方式(Get/Post均可)5.实现转发:6.中文乱码问题5. Respone1. 响应正文2.设置响...原创 2020-03-19 21:37:49 · 771 阅读 · 0 评论 -
JavaWeb体系概论
文章目录JavaWebB/S架构:浏览器和服务器之间的交互:客户端发出请求的格式:服务器收到响应的格式:客户端收到响应后如何显示内容?服务器根据请求内容发送响应信息:Tomcat服务器:Servlet程序的使用:Jsp:ajax:JavaWebB/S架构:浏览器: 一种客户端软件。Http协议:定义了浏览器和服务器通讯的基本规则之一。浏览器和服务器之间的交互:交互模式:请求——响...原创 2020-03-14 20:38:30 · 151 阅读 · 0 评论 -
Netty入门以及粘包拆包
NIO编程关于NIO相关的文章网上也有很多,这里不打算详细深入分析,下面简单描述一下NIO是如何解决以上三个问题的。1. 解决线程资源受限NIO编程模型中,新来一个连接不再创建一个新的线程,而是可以把这条连接直接绑定到某个固定的线程,然后这条连接所有的读写都由这个线程来负责,那么他是怎么做到的?我们用一幅图来对比一下IO与NIO 如上图所示,IO模型中,一个连接来了,会创建一个线程,对...原创 2020-03-12 20:01:28 · 176 阅读 · 0 评论