- 博客(23)
- 收藏
- 关注
原创 JUC之CAS,volatile的学习
一、并发编程中的三个概念1.原子性原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。Java内存模型只保证了基本读取和赋值是原子性操作,如果要实现更大范围操作的原子性,可以通过synchronized和Lock来实现。由于synchronized和Lock能够保证任一时刻只有一个线程执行该代码块,那么自然就不存在原子性问题了,从而保证了原子性。2.可见性可见性是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。对
2021-04-02 21:07:21
969
原创 消息队列(二)
一、消息发送样例•导入MQ客户端依赖<dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-client</artifactId> <version>4.4.0</version></dependency>•消息发送者步骤分析1.创建消息生产者producer,并制定生产者组名2.指定N
2021-03-28 16:32:31
273
原创 Arrays.sort()之二维数组排序
Arrays.sort()重载了四类方法:1.sort(T[] a):对指定T型数组按数字升序排序。2.sort(T[] a,int formIndex, int toIndex):对指定T型数组的指定范围按数字升序排序。3.sort(T[] a, Comparator<? supre T> c): 根据指定比较器产生的顺序对指定对象数组进行排序。4.sort(T[] a, int formIndex, int toIndex, Comparator<? supre T> c
2021-02-23 16:00:17
3308
1
原创 Redis数据结构之Zset
一、zset数据结构相比于set,sorted set 增加了一个权重参数 score,使得集合中的元素能够按 score 进行有序排列,还可以通过 score 的范围来获取元素的列表。zset有两种不同的实现,分别是zipList和skipList。zipList:满足以下两个条件:[score,value]键值对数量少于128个;每个元素的长度小于64字节;skipList:不满足以上两个条件时使用跳表(组合了hash和skipList)hash用来存储value到score的映
2021-01-24 22:54:37
26285
1
原创 JavaWeb之转发和重定向
文章目录转发和重定向1.什么是转发1.1什么是转发2.什么是重定向2.1重定向的特点3.重定向与转发的区别:这里我只做一个概念性介绍(主要为了面试),深入学习是远远不够的。转发和重定向1.什么是转发由服务器端进行的页面跳转转发是服务器收到请求后为了完成响应跳转到一个新的地址在servlet中调用转发的语句:request.getRequestDispatcher("/跳转的地址").forward(request, response);//转发到new.jsp1.1什么是转发地址栏不发
2021-01-05 14:29:06
510
1
原创 Java内存模型(JMM)
面试的时候被问到JMM,平时只关注JVM去了,(看来真的是自己学得不够哈哈),被问到JMM时人都懵了,所以特写下一篇博客好好学习,梳理下学习思路。一、主内存和工作内存这两个名词会在下面的学习中经常提到,所以我们先来看看什么是主内存和工作内存。首先,CPU是无法直接对内存中的数据进行计算的,CPU的计算是这样的:1.CPU把内存中的数据加载到寄存器中;(寄存器是CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。)2.对寄存器中的数据进行计算;3.把计算后的数据写回到
2021-01-04 09:30:46
321
原创 浅谈三次挥手与四次握手(面试用)
文章目录一、TCP三次握手1.什么是TCP三次握手2.为什么要三次握手二、TCP四次挥手一、TCP三次握手1.什么是TCP三次握手客户端–发送带有 SYN 标志的数据包–一次握手–服务端服务端–发送带有 SYN/ACK 标志的数据包–二次握手–客户端客户端–发送带有带有 ACK 标志的数据包–三次握手–服务端2.为什么要三次握手三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。第一次握手:Clie
2021-01-02 16:18:32
1113
1
原创 JUC之线程池的学习
文章目录一、什么是线程池二、为什么要使用线程池三、线程池如何使用1.架构说明2.编码实现3.ThreadPoolExecutor底层原理四、线程池的重要参数五、线程池底层工作原理一、什么是线程池线程池就是创建若干个可执行的线程放入一个池(容器)中,有任务需要处理时,会提交到线程池中的任务队列,处理完之后线程并不会被销毁,而是仍然在线程池中等待下一个任务。它的主要特点为:线程复用;控制最大并发数;管理线程。二、为什么要使用线程池第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的销耗
2020-12-13 14:00:52
101
原创 一起来学习Redis吧!
一、NoSQL概述1.什么是NoSQLNoSQL=Not Only SQL(不仅仅是SQL)NoSQL泛指非关系型数据库,NoSQL的产生并不是要否定关系型数据库,而是作为关系型数据库的一个有效补充。2.NoSQL特点1.方便扩展(数据之间没有关系,很好扩展!)2.大数据量高性能(官方数据:Redis一秒写8万次,读取11万次)3.数据类型是多样型的(不需要事先设计数据库!如果表的数据库十分大,很多人就无法设计了!)简而言之即”三高“,高性能、高可扩展、高可用!!二、Redis入门1.什
2020-11-20 09:29:09
1262
2
原创 消息队列的简单介绍(一)
文章目录一、什么是消息队列二、为何使用消息队列1.解耦2.异步(减少响应所需时间)3.削峰/限流三、消息队列的缺点1.系统复杂性提高2.系统可用性降低3.数据一致性问题四、消息队列的相关概念五、 各种MQ产品的比较六、 RocketMQ模型部署模型注意事项同步刷盘与异步刷盘:一、什么是消息队列消息队列可以简单理解为:把要传输的数据放在队列中。当我们需要使用消息的时候可以取出消息供自己使用。消息队列是分布式系统中重要的组件。二、为何使用消息队列使用消息队列主要是为了通过异步处理提高系统性能和削峰、降低
2020-11-10 13:14:10
694
原创 Linux简单入门学习
入门概述1.我们为什么要学习Linux很多的大型项目都是部署在Linux服务器上,所有的Java岗位都需要掌握Linux的基本使用2.Linux简介Linux 是一套免费使用和自由传播的类 Unix 操作系统(mac也是类Unix操作系统),是一个基于 POSIX(可移植操作系统接口) 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统。Linux 能运行主要的 UNIX 工具软件、应用程序和网络协议。它支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的
2020-11-04 12:10:29
2193
原创 SpringBoot整合JWT的学习笔记
1.什么是JWTJWT全称 Json·Web·Token,通俗地讲,也就是通过JSON形式作为Web应用中的令牌,用于在各⽅之间安全地将信息作为JSON对象传输,在数据传输地过程中还可以完成数据加密、签名等相关处理,是目前最流⾏的跨域身份解决⽅案。2.JWT能做什么1.授权(使用JWT最常见的方案)一旦用户登录,每个后续请求将包括JWT,从而允许用户访问该令牌允许的路由、服务和资源。单点登录是当今广泛使用JWT的一项功能,因为它的开销很小并且可以在不同的域中轻松使用。(即JWT能过够实现跨域)2.
2020-10-30 20:08:05
473
1
原创 SpringBoot实战拦截器
1.拦截器拦截器是什么?简单的说,拦截器就是一道阀门,在某个方法访问之前进行拦截,然后在之前或之后加入某些操作,拦截器是AOP的一种实现策略。拦截器主要做什么?对正在进行的流程进行干预拦截器的代码实现:拦截器也主要有三个方法其中preHandle是在请求之前就进行调用,如果该请求需要被拦截,则返回false,否则true;(通常会在该方法里面执行一些过滤操作)postHandler是在请求之后进行调用,无返回值;afterCompletion是在请求结束的时候进行调用,无返回值2.Int
2020-10-29 17:31:58
171
原创 SpringBoot整合支付宝支付+附代码
准备工作:进入沙箱环境,获得沙箱账号(这里网上有很多教程,个人在这里就偷一下懒就不写了)主要写一下代码整合1.写一个整合支付宝沙箱的配置文件zfbinfo.properties# 支付宝网关名、partnerId和appIdopen_api_domain = https://openapi.alipaydev.com/gateway.domcloud_api_domain = http://mcloudmonitor.com/gateway.do#商户idpid = 20881021811
2020-10-28 15:10:11
1314
原创 Java线程间的通信——消费者和生产者模型
生产者消费者模型该模型是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。单线程之生产者与消费者单线程模式:生产者生产商品时,消费者不能消费商品;反之,消费者消费商品时,生产者不能生产商品,即进程在执行时一次只能有线程。这里我们设置缓冲区的容量为1;商品类:package
2020-09-12 18:27:34
213
原创 合并两个有序的链表, 合并后的链表也是有序的(Java实现)
public class LRU { static int num=0; //用链表实现一个LRU缓存(大小为100)中添加一个数据 public static Node addNewValue(Node head,Node x){ Node ptr=head; num++; //1.遍历链表查看数据是否已经存在 while(ptr!=null&&ptr.next.next!=null) {
2020-07-15 19:55:17
373
2
原创 Java中有关链表的练习
练习1:求链表的中间元素举例1:输入:1 --> 2 --> 3输出:2举例2:输入:1 --> 2 --> 3 --> 4输出:2数组:arr[(arr.length-1)/2]链表:1. 遍历链表,求链表的长度length2. 从头遍历边表,找到索引为(length-1)/2的元素public class Ex1 { //已知头结点就可以遍历整个链表 public static int middleElement(Node head)
2020-07-14 09:09:17
176
原创 Java死锁问题学习笔记
Java死锁问题学习笔记设计一个案例:多线程运行环境下,假设程序要访问一个共享变量,对共享变量计算的中间结果用打印机打印出来,而打印机一次只允许一个线程访问分析:显然,一个线程要获取共享变量的访问权(对被用来同步访问的共享变量那把锁加锁——lockA),此外还要获取对打印机的访问权(对被用来同步访问打印机的锁成功加锁——lockB)。新的改变我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:全新的界面设
2020-07-02 08:55:51
207
转载 Java中对象拷贝Object clone()的学习
贴一个我觉得这个知识点写的很好的博文:(看了这些大佬的知识总结,不由感概自己要学的东西真的有很多很多)Java的对象拷贝实现深度拷贝的实例:public class Copy { public static void main(String[] args) throws CloneNotSupportedException { ThirdLevel third=new ThirdLevel(10,20); SecondLevel second=new
2020-06-21 17:22:00
462
原创 写出以下代码的输出,并解释为什么是这样的输出顺序(Java作业题)
public class Run { public static void main(String[] args) { Sub sub=new Sub(); }}class Base{ static{ System.out.println("base static"); } { System.out.println("base构造代码块"); } public Base(){ S
2020-06-17 00:07:36
545
原创 模拟汉诺塔的搬运及搬运次数(Java实现)
众所周知,汉诺塔是一个经典的递归问题。但我一直对它的递归过程一知半解,可以说就是不怎么懂。今天我到知乎上看到大佬的一句话,很有感触,分享给大家:对递归的理解的要点主要在于放弃!放弃你对于理解和跟踪递归全程的企图,只理解递归两层之间的交接,以及递归终结的条件。品,你细品!汉诺塔问题归根结底就三步:1.把 n-1 号盘子移动到辅助杆2.把1号圆盘从起点移到终点3.最后把辅助杆的n-1号盘子也移到终点public class Hanoi { public static void main(
2020-06-11 22:47:59
537
原创 计数排序(适用于1-100以内的数进行排序)
计数排序(适用于1-100以内的数进行排序)大致思路如图:public class Countsort { public static void main(String[] args) { int[] a={3,5,6,4,1,2,1,2};//录入待排序数组 countArray(a); } public static void countArray(int[] a){ int[] countArray=new int[1
2020-06-10 23:25:52
1054
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人