- 博客(30)
- 资源 (6)
- 收藏
- 关注

原创 Java的集合类----ConcurrentHashMap和 Hashtable
ConcurrentHashMap和 HashtableConcurrentHashMap:JDK1.7采⽤数组+链表实现,JDK1.8采⽤数组+链表/红⿊树。Hashtable一直采⽤数组+链表实现线程安全的方式:① ConcurrentHashMap:JDK1.7使用分段锁对数组进⾏分段(Segment),每⼀把锁只锁容器中的⼀部分数据,不同数据段的数据,不存在锁竞争JDK1.8采用 Node 数组+链表/红⿊树实现,并发控制使⽤ synchronized 和CAS实现。② Ha
2021-01-05 22:05:29
209
原创 Java并发编程----锁
JDK1.6 对锁的优化: 偏向锁、轻量级锁、自旋锁、适应性自旋锁、锁消除、锁粗化 等技术。锁主要存在四中状态,依次是:无锁状态偏向锁状态轻量级锁状态重量级锁状态锁可以升级不可降级,即 无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁是单向的。 这种策略是为了提高获得锁和释放锁的效率。偏向锁和轻量级锁的区别偏向锁和轻量级锁都是为了:在无多线程竞争时,减少重量级锁中使用操作系统互斥量的性能消耗。轻量级锁在无竞争时使用 CAS 代替互斥量。而偏向锁则把整个同步都消除。轻量级锁
2021-03-18 16:48:40
235
原创 Java集合类----HashMap、HashSet
HashMap、HashSet的区别?HashMap:实现了Map接⼝,存储键值对,调⽤put()添加元素,使⽤Key计算HashcodeHashSet:实现Set接⼝,仅存储对象,调⽤ add()添加元素,使⽤成员对象来计算hashcode值,若hashcode相同,再用equals()⽅法判断对象是否相等HashSet 底层是基于 HashMap 实现的。( 除了clone() 、writeObject() 、readObject() 等是HashSet自己实现之外,其他⽅法都是直接调⽤
2021-03-18 16:33:41
292
原创 第12天
第12章 微信支付学习目标能够说出微信支付开发的整体思路生成支付二维码查询支付状态实现支付日志的生成与订单状态的修改、删除订单支付状态回查MQ处理支付回调状态定时处理订单状态1 开发准备1.1 开发文档微信支付接口调用的整体思路:按API要求组装参数,以XML方式发送(POST)给微信支付接口(URL),微信支付接口也是以XML方式给予响应。程序根据返回的结果(其中包括支付URL)生成二维码或判断订单状态。在线微信支付开发文档:https://pa
2021-01-11 22:53:43
304
原创 第13天
第13章 秒杀学习目标秒杀业务分析秒杀商品压入Redis缓存Spring定时任务了解-定时将秒杀商品存入到Redis中秒杀商品频道页实现-秒杀商品列表页秒杀商品详情页实现下单实现(普通下单)多线程异步抢单实现-队列削峰1 秒杀业务分析1.1 需求分析所谓“秒杀”,就是网络卖家发布一些超低价格的商品,所有买家在同一时间网上抢购的一种销售方式。通俗一点讲就是网络商家为促销等目的组织的网上限时抢购活动。由于商品价格低廉,往往一上架就被抢购一空,有时只用一秒钟。秒杀商品通常有两种限制:库
2021-01-11 22:52:41
248
原创 第14天
第14章 秒杀学习目标防止秒杀重复排队重复排队:一个人抢购商品,如果没有支付,不允许重复排队抢购并发超卖问题解决1个商品卖给多个人:1商品多订单秒杀订单支付秒杀支付:支付流程需要调整超时支付订单库存回滚1.RabbitMQ延时队列2.利用延时队列实现支付订单的监听,根据订单支付状况进行订单数据库回滚1 防止秒杀重复排队用户每次抢单的时候,一旦排队,我们设置一个自增值,让该值的初始值为1,每次进入抢单的时候,对它进行递增,如果值>1,则表明已经排队,不
2021-01-11 22:52:07
225
原创 Java并发编程----synchronized
Synchronized:解决多线程访问时,资源的同步性,可以保证⽅法、代码块在任意时刻只有⼀个线程执⾏。三种使⽤⽅式:修饰实例⽅法: 给对象实例加锁,进⼊同步代码前,要获得对象实例的锁修饰静态⽅法: 给类加锁,作⽤于类的所有对象实例,修饰代码块: 对指定代码块加锁,进⼊同步代码库前要获得 给定对象的锁。synchronized底层实现原理修饰同步语句块的实现使⽤的是 monitorenter 和 monitorexit 指令,其中monitorenter 指令指向同步代码块的开始位置,
2021-01-10 23:44:19
218
原创 第4天
第4章 lua、Canal实现广告缓存学习目标Lua介绍Lua语法 输出、变量定义、数据类型、流程控制(if..)、循环操作、函数、表(数组)、模块OpenResty介绍(理解配置)封装了Nginx,并且提供了Lua扩展,大大提升了Nginx对并发处理的能,10K-1000KLua->广告缓存操作广告缓存载入与读取Nginx讲解限流操作:漏斗限流原理 1.控制速率 2.并发量控制Canal讲解实现数据同步操作->MySQLCanal实现
2021-01-10 23:44:08
266
原创 计算机网络----http、https区别
HTTP 和 HTTPS 的区别?HTTP的URL由“http://”开头,默认使⽤80端⼝HTTPS的URL由“https://”开头,默认使⽤443端⼝HTTP运⾏在TCP上,明⽂传输,客户端和服务器端⽆法验证对⽅身份。HTTPS运⾏在SSL/TLS之上的HTTP协议,SSL/TLS 运⾏在TCP之上。所有传输内容经过对称加密,而对称加密的密钥⽤服务器的证书进⾏了⾮对称加密。HTTPS耗费更多服务器资源。对称加密:密钥只有⼀个,加密解密为同⼀个密码,加解密速度快,如DES、AES等;⾮对称
2021-01-10 23:43:55
220
原创 Java并发编程----synchronized和 volatile 关键字的区别
Volatile:保证变量的可⻅性、防⽌指令重排Java 内存模型,线程可以把变量保存在本地内存(寄存器)中,而不是直接在主存中读写。可能造成⼀个线程在主存中修改了变量的值,而另外⼀线程使用变量在寄存器的拷贝,造成数据的不⼀致。变量声明为volatile,为了确保每次都到主存中进⾏读取。使用volatile前使用volatile后synchronized和volatile的区别volatile只能⽤于变量,⽽synchronized可以修饰⽅法、代码块。volatile主要解决变量在多线
2021-01-10 23:42:52
261
原创 计算机网络----http1.0/1.1区别
HTTP 1.0和HTTP 1.1的区别?1.HTTP1.0默认使⽤短连接,即每次请求都要重新建⽴连接。HTTP 1.1起默认⻓连接。HTTP1.1的长连接分为流⽔线⽅式和⾮流⽔线⽅式。⾮流⽔线⽅式:客户在收到前⼀个响应后才能发送下⼀个请求。流⽔线⽅式:客户在收到响应之前,就能发送新的请求。2.HTTP1.1中新增了24个错误状态响应码如409表示请求的资源与资源的当前状态发⽣冲突;410表示服务器上的某个资源被永久性删除。3.缓存处理 :HTTP1.0在请求头中使⽤If-Modifie
2021-01-10 23:41:00
563
1
原创 计算机网络----访问URL的过程
浏览器中输⼊url地址 —>显示主⻚的过程DNS解析(浏览器缓存->系统缓存–>路由器缓存->DNS缓存)建立TCP连接浏览器向web服务器发送HTTP请求(cookie也会随请求一起发送)服务器处理请求并返回HTTP报⽂浏览器解析渲染⻚⾯,显示HTML连接结束DNS域名解析 –> 发起TCP的三次握手 –> 建立TCP连接后发起http请求 –> 服务器响应http请求,浏览器得到html代码 –> 浏览器解析html代码,并请求html代
2021-01-07 22:05:30
456
原创 计算机网络----ARQ协议
ARQ协议:⾃动重传请求,通过使⽤确认和超时机制,在不可靠服务上实现可靠传输。如果发送⽅在发送后⼀段时间之内没有收到确认帧,会重新发送。ARQ包括停⽌等待ARQ协议和连续ARQ协议。停⽌等待ARQ协议为了实现可靠传输,每发完⼀个分组就停⽌发送,等待对⽅确认(回复ACK)。如果过了⼀段时间(超时时间后),还是没有收到 ACK 确认,则重新发送,直到收到确认后再发下⼀个分组;若收到重复分组,就丢弃,但同时还要发送确认;优点:简单缺点:信道利⽤率低,等待时间⻓⽆差错情况:发送⽅发送分组,接收⽅在
2021-01-07 19:03:02
3577
原创 计算机网络----流量控制、拥塞控制
流量控制:滑动窗⼝实现。控制发送⽅发送速率,保证接收⽅来得及接收。拥塞控制:慢开始、拥塞避免、快重传和快恢复慢开始:由⼩到⼤逐渐增⼤拥塞窗⼝数值。初始值为1,每经过⼀个传播轮次,值加倍。拥塞避免:拥塞窗⼝缓慢增⼤,每经过⼀个往返时间拥塞窗口+1拥塞窗口最开始:最开始是翻倍,到达阈值后,再变成+1假设阈值是16,则1->2->4->8->16->17->18->19…快重传和快恢复:收到不按顺序的,⽴即给发送方⼀个重复确认。发送方收到3个重复确认,则认为
2021-01-07 17:03:00
362
原创 计算机网络----TCP如何保证可靠传输
TCP 协议如何保证可靠传输?1.数据被分割成数据块。2.TCP 给发送的每⼀个包编号,接收⽅对包排序,把有序数据传给应⽤层。3.校验和:保持⾸部和数据的检验和。如果收到报文段的检验和有错,将丢弃且不确认收到该报⽂段。4.接收端丢弃重复数据。5.流量控制:利⽤滑动窗⼝实现,只允许发送 接收端缓冲区 能接纳的数据(若为0则不能发送)。当接收⽅来不及处理时,会提示发送⽅降低发送速率,防⽌包丢失。6.拥塞控制:⽹络拥塞时,减少数据发送(发送方维护一个拥塞窗口)。7.ARQ协议:每发完⼀个分组就停⽌发
2021-01-07 13:30:33
291
原创 计算机网络----三次握⼿和四次挥⼿
三次握手第一次握手:客户端–发送带有 SYN 标志的数据包–服务端第二次握手:服务端–发送带有 SYN/ACK 标志的数据包–客户端第三次握手:客户端–发送带有带有 ACK 标志的数据包–服务端为什么要三次握⼿三次握⼿的⽬的就是双⽅确认⾃⼰与对⽅的发送与接收是正常的。第⼀次握⼿:Client 什么都不能确认;Server 确认了对⽅发送正常,⾃⼰接收正常第⼆次握⼿:Client 确认了:⾃⼰发送、接收正常,对⽅发送、接收正常;Server 确认了:对⽅发送正常,⾃⼰接收正常第三次握⼿:Cli
2021-01-07 13:30:02
359
原创 JVM----GC(下)
圾收集算法有:标记-清除算法、复制算法、标记-整理算法、分代收集算法标记-清除算法首先标记要回收的对象,标记完成后回收所有被标记的对象,会产生大量不连续的内存碎片复制算法将内存划分为两个相等块,每次只用其中一块。把存活的对象复制到另一块内存中,然后把这块内存清理掉,内存的可用空间减半。标记-整理算法这是标记-清除算法的升级版。在完成标记阶段后,让存活对象向着一端移动,进行整理。分代收集算法首先根据对象存活周期将分为新生代、老年代。在新生代中选择复制算法,每次垃圾收集有大量对象死去,少量存活
2021-01-06 23:25:53
225
原创 JVM----GC(上)
Java堆分为:新生代和老年代。新生代:被分为Eden和Survivor区,Survivor由FromSpace和ToSpace组成,8:1:1Eden空间不足的时候,会把存活的对象转移到Survivor中。对象从新生代消失的过程称为minor GC老年代:用于存放新生代中经过多次垃圾回收仍然存活的对象。从老年代中消失的过程,称为major GC或full GC。新生代: Eden区、s0区、s1区。对象先在 Eden 区分配,在⼀次新⽣代垃圾回收后,若对象还存活,则进⼊ s0 或s1,对象
2021-01-06 23:25:22
1194
原创 JVM----强引⽤、软引⽤、弱引用、虚引用
强引用:如果⼀个对象具有强引用,那垃圾收集器绝不会回收它,当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,终止软引⽤软引用:如果内存空间足够,就不会回收,内存空间不⾜,就会回收这些对象的内存。可实现缓存的功能弱引用弱引用可以和⼀个引用队列联合使用,如果弱引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加⼊到引用队列中。在垃圾回收器线程扫描内存区域时,⼀旦发现了只有弱引用的对象,不管当前内存空间是否充足都会回收它的内存。虚引用在任何时候都可能被垃圾回收,主要用来跟
2021-01-06 22:36:32
354
原创 JVM----Java内存区域
JVM内存区域:线程共享:堆和⽅法区 (JDK1.8之后改为元空间),线程私有:程序计数器、虚拟机栈、本地⽅法栈JDK1.6:JDK1.8:程序计数器的作⽤:通过改变程序计数器来依次读取指令,从⽽实现代码的流程控制记录当前线程执⾏的位置,多线程情况下,线程切换后能恢复到正确的位置(这个也是线程私有的原因)虚拟机栈:每个 Java ⽅法执⾏时会创建⼀个栈帧⽤于存储局部变量表、操作数栈、动态链接等。从⽅法调⽤到执⾏完成的过程,对应着⼀个栈帧在 Java 虚拟机栈中的⼊栈和出栈。本地
2021-01-06 21:21:01
183
原创 偏向锁、轻量级锁、自旋锁、适应性自旋锁、锁消除、锁粗化
JDK1.6 对锁的优化: 偏向锁、轻量级锁、自旋锁、适应性自旋锁、锁消除、锁粗化 等技术。锁主要存在四中状态,依次是:无锁状态偏向锁状态轻量级锁状态重量级锁状态锁可以升级不可降级,即 无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁是单向的。 这种策略是为了提高获得锁和释放锁的效率。偏向锁和轻量级锁的区别偏向锁和轻量级锁都是为了:在无多线程竞争时,减少重量级锁中使用操作系统互斥量的性能消耗。轻量级锁在无竞争时使用 CAS 代替互斥量。而偏向锁则把整个同步都消除。轻量级锁
2021-01-06 15:26:40
656
原创 Java并发编程----synchronized和ReentrantLock
synchronized和ReentrantLock 的区别①都是可重⼊锁。即同一个线程可以多次获得锁如:⼀个线程获得了某个对象的锁,当锁还没有释放,它还是可以再次获得这个锁,不可重⼊锁则不行。②synchronized 依赖于 JVM 实现的,ReentrantLock 是 JDK 层⾯实现的(即依赖API,需要 lock() 和 unlock() ⽅法配合,try、finally 语句块完成。③ReentrantLock增加了⼀些⾼级功能,①等待可中断;②可实现公平锁;③选择性通知(锁可以绑定多
2021-01-06 15:26:08
226
原创 Java并发编程----线程的简述
线程的⽣命周期和状态线程的状态有创建、就绪、运行、阻塞和死亡。第一是创建状态。在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态;第二是就绪状态。当调用了线程对象的start方法之后,该线程就进入了就绪状态,或者在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态第三是运行状态。处于就绪状态的线程获得CPU时间片就进入了运行状态,开始运行run函数当中的代码。第四是阻塞状态。线程正在运行时被暂停,sleep方法可以导致线程阻塞。第五是死亡状态。如果一个线程的run方法执
2021-01-05 23:20:00
216
原创 Java多线程----程序、进程和线程概述
程序是静态的,含有指令和数据的⽂件。进程是动态的,是程序的⼀次执⾏过程。线程是进程划分的更小单位。⼀个进程在执⾏过程中可以产⽣多个线程。在同一进程中,线程切换不会引起进程切换,但不用进程中的线程切换,会引起进程切换。创建或撤销进程时,系统都要为之分配或回收资源,涉及当前执行进程 的CPU 环境保存 和 新调度进程 的CPU 环境设置,而线程切换时只需保存和设置少量寄存器内容,开销很小。...
2021-01-05 23:19:29
333
1
原创 Java并发编程----ThreadLocal
ThreadLocal:为每个使用该变量的线程提供独立的副本,每个线程都可独立地改变自己的副本,而不影响其它线程的副本。Thread 类中内部有一个ThreadLocalMap 类型的变量,调⽤ThreadLocal 类的get、set⽅法,实际上是调⽤ ThreadLocalMap 类的get、set⽅法。最终的变量不是存在ThreadLocal上,而是存在当前线程的ThreadLocalMap中,ThrealLocal 类可以通过 Thread.currentThread() 获取当前线程对象后
2021-01-05 22:06:47
190
原创 Java并发编程----线程池
线程池的作用:通过重复利用已创建的线程,降低线程创建和销毁造成的消耗。提⾼响应速度。不需要等线程创建。提⾼线程的可管理性。线程池统⼀分配管理。创建线程池的方式有两种使用 Executors创建线程池用ThreadPoolExecutor创建不推荐使用 Executors创建线程池,要用ThreadPoolExecutor创建,因为ThreadPoolExecutor能指定线程池的重要参数。Executors 返回线程池对象的弊端:FixedThreadPool 和 SingleThre
2021-01-05 22:06:03
219
原创 Java的集合类----HashMap、Hashtable 的区别
HashMap、Hashtable 的区别HashMap:⾮线程安全,效率⾼⼀点HashTable:线程安全,方法经过 synchronized 修饰。但已经淘汰,如果要保证线程安全⽤ ConcurrentHashMap,HashMap 允许存在一个空键,多个空值。HashTable则不允许,若有空键或空值,则报空指针异常,HashMap 默认容量为16。每次扩充为2倍。Hashtable 默认容量为11,每次扩充为2n+1,JDK1.8 以后 HashMap 的链表⻓度⼤于阈值(8)时,会将链表
2021-01-05 21:58:06
197
原创 Java的集合类---- Arraylist、LinkedList
Arraylist、LinkedList区别? 1. ArrayList和LinkedList 都是线程不安全; 2. Arraylist底层使⽤Object 数组; LinkedList 底层使⽤双向链表 3. ArrayList适合通过index快速随机访问,LinkedList适合频繁的插入和删除。 4. ArrayList在list列表的结尾会预留⼀定的容量空间,LinkedList还要存放前驱和后继 ArrayList的扩容?有3个不同的构造方法。 1.无参构造方
2021-01-03 01:00:37
295
原创 Java的集合类----简述
Java的集合有List、Set、Map三种基本类型List、Set、Map的区别?List:链表,有序,可出现重复元素Set:集合,无序,不允许重复。Map: 键值对存储。Key不能重复,但不同的Key可以指向相同的对象。其中,每种基本类型下又衍生出多种类型。如ArrayList、LinkedList、HashSet、HashMap等,后续再一一详细介绍。...
2021-01-03 00:43:52
239
原创 Java基础
interface和Abstract的区别?interface是接口,使用implement实现,接口是对行为的抽象。Abstract是抽象,使用extend继承,抽象是对类的抽象。接口方法不能有实现(Java8开始可以有默认实现)抽象类的方法则可以有实现一个类可以实现多个接口,但只能实现一个类。成员变量和局部变量的区别?成员变量是属于类的,局部变量是在⽅法中定义的,成员变量是对象的⼀部分,随着对象的创建⽽存在,局部变量则在⽅法调⽤后会⾃动消失。成员变量会⾃动赋默认值(被 final
2021-01-02 22:48:15
195
Downloads.zip
2019-12-26
2019华南理工大学 敏捷项目管理复习题.doc
2019-12-26
安卓数据库的建立与使用
2018-05-08
广工数据结构课程设计
2016-12-10
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人