自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(102)
  • 收藏
  • 关注

原创 微信h5纸条交友盲盒项目完整版可上线运营|新版springboot+vue前后端分离项目源码授权

本人完全独立开发纸条盲盒交友微信h5项目,亲测上线运营,单日引流几千,收益300左右。

2023-10-05 15:24:45 288

原创 JVM--运行时数据区域

它描述的是Java方法执行的线程内存模型每个方法被执行的时候,都会创建一个栈帧用于存储局部变量表、操作数栈、动态连接、方法出口等信息。与Java堆一样,是各个线程共享的内存区域,用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。是方法区的一部分,用于存放编译器生成的各种字面量与符号引用,这部分内容在类加载后存放到方法区的运行时常量池中。Java虚拟机运行时数据区如下图所示,其中紫色为所有线程共享的数据区,蓝色为线程隔离的数据区。是虚拟机管理的内存中最大的一块空间,...

2022-07-16 21:56:52 330 1

原创 《深入理解Java虚拟机》笔记--走进Java

Java类库API中的JavaSEAPI子集、Java虚拟机。Java程序设计语言、Java虚拟机、Java类库。

2022-07-15 17:21:34 479

原创 同步模式--保护性暂停

Guarded Suspension,用于一个线程等待另一个线程的执行结果。模式结构代码实现这里加入的超时的判断,如果超时,则Thread-0不再等待结果。package com.throne.juc;import lombok.extern.slf4j.Slf4j;/** * @version v1.0 * @Date: 2022/4/15 12:32 * @Author: Mr.Throne * @Description: */@Slf4jpublic class.

2022-04-15 13:53:10 258

原创 并发编程--利用sleep防止CPU空转

在服务器端开发中,由于服务器需要不停的运行,处理发送过来的请求,如果直接使用下面的while循环,很有可能导致CPU空转导致CPU利用率很高,但实际什么也没有做。public class jucTest2 { public static void main(String[] args) { while(true){ } }}CPU的利用率:(15%+)2. 利用sleep进行改进让线程进行睡眠,防止CPU空转。public.

2022-04-14 20:39:31 1141

原创 netty-自定义协议(编解码器)

文章目录自定义协议的要素封装的消息实体编解码器的编写防止黏包半包问题自定义协议的要素魔数:第一时间判定是否为无效的包版本号:可支持协议的升级序列化算法:消息正文采用哪种序列化反序列化方式,如json、hessian等指令类型:表明业务类型,登录/注册/…请求序号:为了实现双工通信,提供异步能力正文长度:消息内容长度消息正文:消息的内容封装的消息实体消息正文采用实体Message:package com.throne.netty.test1.diy;import lombok.A

2022-04-06 11:33:40 906

原创 netty-搭建简单http服务器

netty中提供了许多定义好的协议,如HTTP编解码器,我们利用它可以快速地开发一个基于netty的web服务器。package com.throne.netty.test1.protocol;import io.netty.bootstrap.Bootstrap;import io.netty.bootstrap.ServerBootstrap;import io.netty.buffer.ByteBuf;import io.netty.channel.*;import io.netty.c

2022-04-06 10:35:43 1361

原创 netty-与redis进行简单通信

redis协议约定格式:*3 (命令的词数)$3 (第一个关键词长度)set (第一个关键词)$4name$8zhangsan(每一行末尾都加 回车and换行)package com.throne.netty.test1.protocol;import io.netty.bootstrap.Bootstrap;import io.netty.buffer.ByteBuf;import io.netty.channel.ChannelFuture;import io.net

2022-04-06 10:16:10 707

原创 netty之黏包半包问题详解

文章目录黏包问题半包问题出现问题的原因解决方案短连接定长解码器行解码器LTC解码器黏包问题在客户端循环发送十次数据,服务器端会出现黏包现象。ChannelFuture future = bootstrap.handler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel ch) throws

2022-04-06 00:20:03 618

原创 netty之future和promise详解

文章目录Future和PromiseJDK Futurenetty Futurenetty PromiseFuture和Promisejdk Future:只能同步等待任务结束才能得到结果netty Future: 可以同步或者异步等待任务结束之后得到结果,继承自jdk Future。netty promise:脱离了任务而独立存在,作为两个线程间传递结果的容器,继承自netty Future。JDK Future一个例子:package com.throne.netty.test1.futu

2022-04-05 20:39:12 809

原创 netty之channel详解

文章目录Channelchannel的主要作用channel异步连接处理--channelFuturechannel异步关闭处理--CloseFuture优雅的关闭程序Channelchannel的主要作用close():关闭channelcloseFuture():处理channel的关闭sync 同步等待channel关闭addListener 异步等待channel关闭pipeline():添加处理器write():将数据写入writeAndFlush():将数据写入并刷出

2022-04-04 22:37:00 2760 1

原创 netty之eventloop详解

文章目录EventLoop继承关系线程数选择普通任务与定时任务EventLoop分工细化EventLoopEventLoop本质上是一个单线程执行器(同时维护了一个Selector),内部有run方法处理Channel上的IO事件。继承关系同时继承了ScheduledExecutor定时器,内部包含了线程池的所有方法,进行任务调度;其次继承了OrderedEventExecutor,内部方法能够判断一个线程是否属于当前的EventLoop,并能查看自己属于哪个EventLoopGroup。事

2022-04-04 21:45:10 1641

原创 netty入门--helloworld程序

首先给出最简单的CS架构通信的netty程序,实现了客户端向服务器端写入helloworld的功能。服务器端的代码如下:package com.throne.netty.test1;import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelHandlerContext;import io.netty.channel.ChannelInboundHandlerAdapter;import io.netty.c

2022-04-04 18:46:44 308

原创 观察者模式VS发布订阅模式

1. 观察者模式直观理解观察者模式本质上实现了一种松耦合,当有消息更新时,由被观察者直接调用内部notify()方法,对订阅了该被观测者的观察者一一进行通告update()操作。2. 发布订阅模式直观理解在发布/订阅模式中,拥有一个区别于观察者模式的最重要的角色Broker–也就是消息调度中心,publisher向broker发布各种消息,subscriber则向broker订阅其感兴趣的消息类型。一旦发布者发布了订阅者感兴趣的消息类型,则将其告知订阅者。3. 二者的区别观察者模式实现了模块之

2022-03-29 16:38:28 208

原创 推荐系统学习(二)--UserCF与ItemCF推荐算法

文章目录基于近邻的推荐算法UserCF算法原理ItemCF算法原理UserCF与ItemCF的对比分析基于近邻的推荐算法基于近邻的推荐算法是比较基础的算法,应用较为广泛,这里的近邻算法指的是协同过滤算法。包含基于用户的协同过滤算法(UserCF)和基于物品的协同过滤算法(ItemCF)。协同过滤的核心思想就是基于相似性度量。UserCF算法原理核心思想:先找到相似用户,再找到他们喜欢的物品ItemCF算法原理UserCF与ItemCF的对比分析...

2022-01-22 22:41:51 2994

原创 推荐系统学习(一)--电影推荐系统搭建

电影推荐系统

2022-01-16 20:29:19 2274 2

原创 使用BufferedReader读取socket流的阻塞问题解决方法

通过BufferedReader的ready()方法来解决,其规约中表述:该方法能告诉我们该流是否准备好被读取,即流中内容不空时返回true,否则返回false。代码如下:// 输入流 InputStream is = socket.getInputStream(); StringWriter writer = new StringWriter(); BufferedReader reader = new

2021-10-30 23:25:31 1687

原创 NIO基础--零拷贝

在linux2.4之后,java的nio中调用transferTo方法后,直接从用户态切换至内核态,使用DMA将数据读入内核缓冲区,其次只会将一些length和offset信息拷入socket缓冲区,几乎无消耗;使用DMA(硬件完成)进行拷贝,不会使用CPU。可以看到,所谓的零拷贝实际上数据拷贝了两次,第一次是从硬盘到内核缓冲区,第二次是从内核缓冲区到网卡。零拷贝只是不会在JVM中进行拷贝。...

2021-10-22 11:35:15 184

原创 NIO基础--多线程优化服务器

在前面的代码实现中,只有一个选择器selector来管理一个线程,并没有充分的利用多核CPU。这里采用多线程对其进行优化,并设置多个selector对其进行管理。采用如下的思想进行优化,设置一个Boss线程,仅仅负责连接的建立;而worker用于读写操作。多线程版服务端代码如下:package org.throne;import lombok.extern.slf4j.Slf4j;import java.io.IOException;import java.net.InetSocke.

2021-10-22 11:18:11 280 2

原创 NIO基础--阻塞与非阻塞

非阻塞模式服务器:package org.throne;import lombok.extern.slf4j.Slf4j;import java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.ServerSocketChannel;import java.nio.channels.SocketChannel;import java.u

2021-10-21 15:15:50 238

原创 NIO基础--bytebuffer基本使用

文章目录使用实例ByteBuffer的结构使用实例利用bytebuffer和channel存储读取文件。package org.throne;import lombok.extern.slf4j.Slf4j;import java.io.FileInputStream;import java.io.IOException;import java.nio.ByteBuffer;import java.nio.channels.FileChannel;/** * @version v1

2021-10-20 22:15:01 367

原创 NIO基础--三大组件

NIO non-blocking io 非阻塞IONIO三大组件1. Channel & Bufferchannel是读写数据的双向通道,可以从channel中将数据读入Buffer(缓存),也可以将Buffer中的数据写入channel,channel比stream更底层。常见的channel:FileChannel:文件通道DatagramChannel:UDPSocketChannel:TCP,用于服务器ServerSocketChannel:TCP,一般用于客户端b

2021-10-20 21:15:56 95

原创 LC 旋转数组

采用临时数组保存旋转后的数组,然后再一一赋值。/** * @version v1.0 * @Date: 2021/8/9 17:58 * @Author: Mr.Throne * @Description: * 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。 * * * 进阶: * * 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。 * 你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗? * * 示例一: * 输入:

2021-08-09 18:21:54 81

原创 LC 买卖股票的最佳时机Ⅱ

采用贪心的策略,仅仅考虑相邻两天的差价即可。/** * @version v1.0 * @Date: 2021/8/9 17:49 * @Author: Mr.Throne * @Description: * 给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格。 * * 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。 * * 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。 * * 示

2021-08-09 17:58:20 98

原创 LC 删除数组元素重复项 java实现

题目:给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。示例:输入:nums = [1,1,2]输出:2, nums = [1,2]解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。由于数组元素是排好序的,可以采用双游标的思想,左游标负责更新数组元素,右游标

2021-08-03 10:34:44 112

原创 简洁高斯朴素贝叶斯分类原理及python实现

高斯朴素贝叶斯分类器是针对特征值连续的情况下给出的一种分类方法。贝叶斯公式所有的贝叶斯分类器的基石都是概率论中的贝叶斯公式,给定训练数据集D={xi,Ci},i=1,...,N,xi∈RD,Ci∈1,...,KD=\{x_i,C_i\},i=1,...,N,x_i\in R^D,C_i\in {1,...,K}D={xi​,Ci​},i=1,...,N,xi​∈RD,Ci​∈1,...,K有贝叶斯公式如下:p(C∣x)=p(C)p(x∣C)p(x),C∈{C1,C2,...,Ck}p(C|x)=\fra

2021-07-16 17:21:29 4001 6

原创 设计模式--访问者模式

访问者模式(Visitor),封装一些作用于某种数据结构的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。UML结构图如下:其中,Visitor是抽象访问者,为该对象结构中ConcreteElement的每一个类声明一个Visit操作;ConcreteVisitor是具体访问者,实现每个由visitor声明的操作,是每个操作实现算法的一部分,而该算法片段是对应于结构中对象的类;ObjectStructure为能枚举它的元素,可以提供一个高层的接口以允许访问者访问它的元素;Ele

2021-07-07 20:55:51 75

原创 设计模式--策略模式

策略模式:定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。也称为政策模式(Policy)。策略模式把对象本身和运算规则区分开来,其功能非常强大,因为这个设计模式本身的核心思想就是面向对象编程的多形性的思想。策略模式的结构:环境类(Context):用一个ConcreteStrategy对象来配置。维护一个对Strategy对象的引用。可定义一个接口来让Strategy访问它的数据。抽象策略类(Strategy):定义所有支持的算法的公共接口。

2021-07-07 20:48:41 108

原创 ICS大作业--程序人生

2021-06-27 20:24:01 88

原创 系统级IO

1. IO接口接口:连接CPU和外设之间的部件,它完成CPU于外界的信息传送。还包括辅助CPU工作的外围电路,如中断控制器、DMA控制器、定时器、高速CACHE。IO接口框图:接口的十大功能:输入输出功能数据缓冲功能联络功能数据转换功能中断管理功能提供时序控制功能寻址功能可编程功能电器特征的匹配功能错误监测功能2. 端口端口的概念:1. 软件上:接口中程序员可编程读写的寄存器地址。2. 硬件上:接口电路中的寄存器等。端口的分类:1. 数据口:输入、输出的数据信息2

2021-06-21 15:32:38 217

原创 Springboot整合RabbitMQ

生产者:创建生产者SpringBoot工程引入依赖坐标编写yml配置,基本信息配置定义交换机,队列以及绑定关系的配置类注入RabbitTemplate,调用方法,完成消息发送目录结构:一个消息生产者、一个消息的消费者。消息生产者:RabbitMQConfig.javapackage com.throne.mq_producer.config;import org.springframework.amqp.core.*;import org.springframework.bea

2021-06-14 22:54:09 84

原创 RabbitMQ--路由模式&Topics模式

路由模式队列与交换机的绑定不再是任意绑定,而是指定一个RoutingKey;消息生产者在向Exchange发送消息时,必须指定消息的RoutingKey。Exchange根据RoutingKey来选择对应的队列发送消息。通配符模式*. .*代表一个任意单词。#. .#代表任意多个单词。...

2021-06-14 21:56:42 84

原创 RabbitMQ--发布订阅模式

在发布/订阅模式中加入了交换机角色,交换机收到消息后将其分发到不同的队列,然后再被不同的消费者接受。交换机类型:Fanout:广播,将消息交给所有绑定到交换机的队列Direct:定向,把消息交给符合指定routing key的队列Topic:通配符,把消息交给符合routing pattern(路由模式)的队列交换机只负责转发消息,不具备存储消息的能力,因此如果没有任何队列与Exchange绑定,或者没有符合路由规则的队列,那么消息会丢失。下面实现需求:同一条日志消息,分别实现保存到数据库

2021-06-14 21:30:52 2427 1

原创 RabbitMQ--工作队列模式

工作队列模式即有一个消息生产者,可以有多个消息消费者,这些消费者之间处于竞争关系,对于同一条消息只会被接收处理一次。Consumer_WorkQueues1.java:package com.example;import com.rabbitmq.client.*;import java.io.IOException;import java.util.concurrent.TimeoutException;/** * @version v1.0 * @Date: 2021/6/11 2

2021-06-14 21:01:18 1162

原创 动态内存分配--显式空闲链表

显式空闲链表在空闲块中使用指针连接空闲块,仅仅需要关注空闲块,数据结构如下:仍然需要边界标记来进行空闲块合并。显示空闲链表的释放LIFO后进先出法:将新释放的块放置在链表的开始处(常数时间;碎片太多)地址顺序法:按地址顺序维护链表(需要搜索;碎片少于LIFO)小结与隐式空闲链表相比:分配时间从块总数的线性时间减少到空闲块数量的线性时间(当大量内存被占用时快得多)因为需要在列表中拼接块,释放和分配稍显复杂每个块需要额外两个字...

2021-06-14 10:31:03 1103

原创 动态内存分配--隐式空闲链表

Implicit List 隐式空闲链表对于每个块都需要知道块大小和分配状态,这样可能需要两个words,但是由于块是对齐的,比如8字节对齐,则块大小的低三位恒为0,这样就可以使用低三位来存储分配状态。在实际设计中,往往使用最低位标记已分配/未分配状态。1. 如何找到一个空闲块1. 首次适配(First fit)从头开始搜索空闲链表,选择第一个合适的空闲块可以取总块数(包括已分配和空闲块)的线性时间会在靠近链表起始处留下小空闲块的碎片(长期运行后)2. 下次适配(Next fit)和

2021-06-14 10:10:48 1417

原创 动态内存分配--基本概念

在程序运行时程序员使用动态内存分配器(如malloc)获得虚拟内存,动态内存分配器维护着一个进程的虚拟内存区域,称为堆。分配器将堆视为一组不同大小的块(blocks)的集合来维护,每个块要么是已分配的,要么是空闲的。分配器的类型:显示分配器:要求应用显示地释放任何已分配的块隐式分配器:应用检测到已分配块不再被程序所使用,就释放这个块(GC)动态内存分配器:无法控制分配块的数量和大小立即响应malloc请求必须从空闲内存分配块必须对齐块,使得它们可以保护任何类型的数据对象只能操作或改

2021-06-14 09:21:03 330

原创 虚拟内存--概念

1. 地址空间物理地址:是内存单元的绝对地址,计算机的主存被组织成一个由M个连续的字节大小的单元组成的数组,每字节都有一个唯一的物理地址,例如0x0代表主存的第一个物理单元,0x15代表第16个物理单元,所有地址最终处理结果都是物理地址。在CPU实模式下,由段基址*16+段偏移就得到了物理地址。线性地址/虚拟地址:CPU保护模式下,段基址+段偏移叫做线性地址,段寄存器中存储的并不是真正的段基址,需要以段描述符作为下标,到GDT/LDT表查表获得段地址,段地址+偏移地址=线性地址。当开启分页功能后,线性

2021-06-13 15:50:20 414

原创 RabbitMQ入门--简单模式

1. 简单模式实现步骤创建工程(生产者、消费者)分别添加依赖编写生产者发送消息2. java实现首先创建两个modules,目录结构如下:引入依赖: <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>5

2021-06-11 23:24:39 125

原创 CentOS下RabbitMQ的安装配置

安装环境yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c++ kernel-devel m4 ncurses-devel tk tc xz下载软件包链接:https://pan.baidu.com/s/1QuDP_c11PMx_5ON3FUxmAQ 提取码:otnn 安装erlang环境rpm -ivh erlang-18.3-1.el7.centos.x86_64

2021-06-11 21:55:29 109

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除