自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 计算机网络常见问题总结

以下内容仅根据个人理解编写,为了便于记忆和口头阐述,如有疏漏,请多指正。流量控制是为了控制发送方发送数据的速率,保证接收方要来得及确认、接收,防止丢包;为了控制这个速率,接收方会规定自己的一个接收能力,并以此来限制发送方所发送的数据;TCP协议是通过滑动窗口来实现流量控制的,接收方可以通过确认报文的首部中的窗口字段来控制发送方的窗口大小,发送方每次最多能发送不得超过窗口大小的数据,以此来实现流量控制;它是TCP协议用于实现流量控制的一种机制。

2023-09-22 18:01:36 190

原创 Spring boot+MyBatis实现五表级联查询(通过注解实现!!!)

以上级联查询流程均出发自个人角度,为了便于自己理解流程与日后应用,如有不对的地方请及时纠正我。总之就是将当前表的Id传入下一级方法,下一级方法join进关系表,并用on进行两表之间的关联,然后普通查询就行,以此类推相同步骤。。。

2023-09-08 00:06:32 342

原创 线程池核心源码阅读

为ExecutorService的。

2023-09-05 22:04:57 105

原创 Redis企业级解决方案

缓存预热就是系统启动前,提前将相关的缓存热点数据直接加载到缓存系统中。避免服务器在刚启动的时候遇到大量请求的冲击所导致宕机。可以让用户在服务器刚启动时就可以直接在缓存系统中查询事先被预热的缓存数据。

2023-08-27 18:24:22 154

原创 ReadWriteLock、StampedLock、Semaphore以及死锁总结

悲观锁(Pessimistic Locking), 具有强烈的独占和排他特性。它指的是对数据被外界修改持保守态度。因此,在整个执行过程中,将处于锁定状态。所以,悲观锁是一种悲观思想,它总认为最坏的情况可能会出现,它认为数据很可能会被其他人所修改,所以悲观锁在持有数据的时候总会把资源 或者 数据 锁住,这样其他线程想要请求这个资源的时候就会阻塞,直到等到悲观锁把资源释放为止。Java 中的Synchronized 和 ReentrantLock 是一种悲观锁思想的实现。

2023-08-23 19:49:01 71

原创 ThreadLocal总结与使用

ThreadLocal被称为线程局部变量,用于在线程中保存共享变量(不同的线程中保存的值不同)。由于在ThreadLocal中保存的数据仅在当前线程中,所以对于其他线程来说是隔离起来的,也就是说该变量是当前线程独有的变量。// 线程局部变量@OverridethreadLocal.set("妲己");show();},"线程1");@OverridethreadLocal.set("后羿");show();},"线程2");t1.start();t2.start();

2023-08-21 21:04:14 110 1

原创 synchronized关键字实现原理

synchronized是Java内建的同步机制,它提供了互斥的语义和可见性,我们对它的普遍理解就停留在了: 当一个线程已经获取当前锁时,其他试图获取同步锁的线程只能阻塞在那里。这样的认知其实也不算是错的,但是它并没有我们想象中的那么凶狠,直接就给你上操作系统的互斥锁,如果不考虑线程的数量,以及是否并发,一味的使用操作系统分配的资源,那么这样必然会造成大量的资源浪费,其实它也有自己温柔的一面(在JDK1.6以后进行了优化)。在Java 5 以前,synchronized是仅有的线程同步手段。

2023-08-14 22:29:18 42

原创 自定义线程池的重要参数------阻塞队列

BlockingQueue阻塞队列接口,是一个支持两个附加操作的队列。在队列为空时,获取元素的线程会等待队列变为非空。当队列元素已满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是往队列里拿出元素的线程。阻塞队列的角色就是充当生产者存放元素的容器,而消费者只从容器里拿出元素,这也在一定程度上平衡了二者之间的处理能力,解决了它们之间的强耦合关系,在保证并发安全的同时,提高了队列的存取效率。

2023-08-05 20:50:02 154 1

原创 线程池分类总结

Java标准库中为我们提供了几种常用的线程池,创建这些线程池的方法都被封装到Executors工具类中。线程数量固定的线程池,使用Executors.newFixedThreadPool()创建;CachedThreadPool:线程数根据任务动态调整的线程池,使用Executors.newCachedThreadPool()创建;SingleThreadExecutor: 仅提供一个单线程的线程池,使用Executors.newSingleThreadExecutor()来创建;

2023-08-04 20:20:51 46 2

原创 RSA算法(非对称加密算法)的JAVA实现案例及总结

对称加密(也叫私钥加密)指加密和解密使用相同密钥的加密算法,在大多数的对称算法中,加密密钥和解密密钥是相同的,所以也称这种加密算法为单密钥算法。对称加密算法的特点是算法公开、计算量小、加密速度快、加密效率高。不足之处是,交易双方都使用同样钥匙,那么如果在网络上传输时,被黑客劫取到了密钥,那么就会造成严重的安全性漏洞。所以对称加密算法的安全性得不到保证。非对称式加密: 加密和解密使用不同的密钥。例如,用户A密钥加密后所得到的信息,只能用用户A的解密密钥才能解密。如果知道了其中一个,并不能计算出另外一个。

2023-07-27 21:02:41 328 1

原创 DH算法(密钥交换算法)的总结和Java实现案例

我们在使用AES算法的过程中,使用了相同的密钥,那么如果在实际应用中: 在网络上的两个用户之间需要传输文件时,A使用自己的密钥向B发送了加密文件,那么B就需要A的密钥来解密文件。那么这就会出现安全隐患:在不安全的信道上A发送的加密文件被黑客拿到了,但是由于是加密过的,所以没有什么用。但是如果被黑客拿到了密钥呢?要解决这个问题,就需要使用密钥交换算法:DH算法(Diffie-Hellman算法)。DH算法解决了在双方不直接传递密钥的情况下完成密钥交换。

2023-07-21 20:23:32 906 2

原创 ReentrantLock与synchronized的区别

每个Java对象都可以充当一个实现同步的锁,这些锁被称为内置锁(Intrinsic Lock)或者监视器锁(Monitor Lock)。其中, 括号里面的reference-to-lock就是锁的引用, 任何一个Java对象都可以成为reference-to-lock。你可以实例化一个Object对象,将它作为锁。如果直接使用this,代表使用当前对象作为锁。//临界区。

2023-07-19 20:53:51 42

原创 CopyOnWriteArrayList核心源码阅读

Copy-On-Write简称COW,是一种用于集合的并发访问的优化策略。基本思想是:当我们往一个集合容器中写入元素时(添加、修改、删除),并不会直接在集合容器中写入,而是先将当前集合容器进行Copy,复制出一个新的容器,然后新的容器里写入元素,写入操作完成之后,再将原容器的引用指向新的容器。这样做的好处:实现对CopyOnWrite集合容器写入操作时的线程安全,但同时并不影响进行并发的读取操作。所以CopyOnWrite容器也是一种读写分离的思想。

2023-07-18 20:51:54 62 1

原创 线程池的执行流程

个人理解: 线程池就是管理并维护了若干线程,并对这些线程进行分配调度以及一些别的操作,是一套具有完整执行流程的机制。线程池内部维护了若干个线程,没有任务的时候,这些线程都处于等待空闲状态。如果有新的线程任务,就分配一个空闲线程执行。如果所有线程都处于忙碌状态,线程池会创建一个新线程进行处理或者放入队列(工作队列)中等待。

2023-07-17 19:48:51 136 1

原创 线程的实现方式

线程的创建方式其实和普通的通过new关键字创建实例对象没有什么区别,只是Thread类的构造方法进行了多次重载,使得在调用构造方法时可以传入不同的参数,来实现不同功能、是否具有返回值等不同的线程对象。线程的不同创建方式本质就是在调用构造方法时传入不同的参数,来实现创建出的线程对象的不同功能(通过线程池创建除外)。线程创建有四种方式: 继承Thread类,实现Runnable接口,实现Callable接口,最后一种通过线程池分配线程,但需要传入Runnable的实现类对象;

2023-07-15 18:35:42 48 1

原创 对称加密算法总结及Java案例实现

所谓对称加密算法就是使用同一把密钥进行加密和解密。例如,我们平常使用的WinZip和WinRAR,它们对压缩包的加密和解密,使用的就是对称加密算法。从程序的角度看,加密其实就是通过一个函数,传入密钥和明文这两个参数,然后会输出通过该密钥加密后的密文:解密则恰恰相反,接收密钥和密文,然后输出明文:对称加密算法使用同一个密钥进行加密和解密,常用算法有DES、AES和IDEA等;密钥长度由算法设计决定,AES的密钥长度是128/192/256位;

2023-07-14 20:36:57 119 1

原创 Java反射总结

Java反射机制就是程序在运行状态中,对于任意一个类,我们都能得到它的Class对象,来获取关于该类的所有信息,并根据需求调用它的任意方法和属性进行一些操作,这种动态获取信息以及动态调对象的属性或方法的功能成为Java的反射机制。

2023-07-13 20:42:00 66 1

原创 哈希算法总结及案例实现

哈希算法可用于验证数据完整性,具有防篡改检测的功能;常用的哈希算法有 MD5 、 SHA-1 等;用哈希存储口令时要考虑彩虹表攻击。Hmac 算法是一种标准的基于密钥的哈希算法,可以配合 MD5 、 SHA-1 等哈希算法,计算的摘要长度和原摘要算法长度相同。BouncyCastle 是一个开源的第三方算法提供商;BouncyCastle 提供了很多 Java 标准库没有提供的哈希算法和加密算法;

2023-07-10 21:00:10 1001 3

原创 JavaMail发送不同类型邮件的案例总结与实现步骤

使用JAVA程序进行发送邮件,使用的是SMTP协议,它是 Simple Mail Transport Protocol 的缩写,使用标准端口 25 ,也可以使用加密端口 465 或 587。SMTP 协议是一个建立在 TCP 之上的协议,任何程序发送邮件都必须遵守 SMTP 协议。使用 Java 程序发送邮件时,我们无需关心 SMTP 协议的底层原理,只需要使用 JavaMail这个标准 API 就可以直接发送邮件。

2023-07-08 21:35:06 923 4

原创 基于FTP编程操作FTP服务器的代码案例以及实现步骤细节

既然我们是对FTP服务器进行操作,那么我们编写的程序则是基于FTP协议的客户端程序(FTPClient),其中实现了一些对服务器的操作。基于面向对象的设计思想,必须先实例化出FTPClient对象继续进行,然后连接服务器并验证身份后去实现各种不同的操作。tips: 基于此协议进行编程需要拓展包commons-net-3.6.jar的支持。

2023-07-08 18:02:27 512 4

原创 HashMap的数据结构

HashMap类是集合框架中Map接口的实现类,是一种键-值映射表,所以我们对比单列集合,它的优点就在于能够高效的通过key查找出对应的value。在JDK 1.7及之前,HashMap结构采用数组+ 单向链表的形式存储键值对。而且在链表中插入元素时,采用的是[头插法],即将新节点每次放在链表的头部。到了JDK 1.8以后其内部结构采用数组+单向链表+红黑树的形式存储键值对,在链表插入元素时改用[尾插法]。

2023-07-01 18:52:56 176 3

原创 LinkedList源代码阅读

前面说到ArrayList类的操作方式,底层是基于数组实现的,那么同样作为List接口实现类的LinkedList,则是通过"链表"的方式实现了List接口。我们首先来看它的定义:继承自类: 强调基于迭代器的方式实现连续性,因为LinkedList基于链表实现,所以该类更使用于它。实现了List接口: 具有有序,允许重复值的特点。实现了Deque接口: 同时作为双向队列的实现。实现了Cloneable接口: 可使用Clone()函数,能克隆。实现了接口: 支持序列化,可通过序列化去传输。

2023-04-26 16:08:49 35 3

原创 ArrayList扩容机制的理解

由于不断地扩容会带来一定的系统开销,那么我们一般会预估本次对象的初始化容量为多少,所以就重载了构造方法,创建对象的时候传入一个预估值,那么会根据这个值来创建底层数组。添加第十一个之前,数组不为默认容量的空数组,则返回的值总是小于或等于10,所以if()条件不会成立,不执行扩容操作。调用grow()方法: 先将数组长度赋给oldCapacity,新容量的计算为旧容量右移一位,然后再加上旧容量,所以。修改次数+1,此时最小容量为10,数组长度为0,条件成立,执行。后者由于没有指定容量,则为一个待扩容的空数组。

2023-04-21 23:55:09 178 3

空空如也

空空如也

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

TA关注的人

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