- 博客(37)
- 收藏
- 关注
原创 Bean 的生命周期总结
Java 中的公共类称之为 Bean 或 Java Bean,而 Spring 中的 Bean 指的是将对象的生命周期,交个 Spring IoC 容器来管理的对象。所以 Spring 中的 Bean 对象在使用时,无需通过 new 来创建对象,只需要通过 DI(依赖注入),从 Spring 中取出要使用的对象即可。因为初始化的前置方法和后置方法是为所有 Bean 服务的,而非为某一个 Bean 服务的,所以这两个方法不能写在某个具体的 Bean 中,否则(这两个方法)不会执行。
2023-09-09 14:07:15
8212
69
原创 Spring 中存取 Bean 的相关注解
属性注⼊的优点是简洁,使⽤⽅便;缺点是只能⽤于 IoC 容器,如果是⾮ IoC 容器不可⽤,并且只有在使⽤的时候才会出现 NPE(空指针异常)Setter ⽅式是 Spring 前期版本推荐的注⼊⽅式,但通⽤性不如构造⽅法,所有 Spring 现版本已经推荐使⽤构造⽅法注⼊的⽅式来进⾏类注⼊了。
2023-09-03 16:06:11
4538
55
原创 UDP 的报文结构和注意事项
第一种方案(不推荐):通过代码的方式针对应用层数据报进行手动的分包,拆分成多个包通过多个UDP数据报进行传输。第二种方案(推荐):不用UDP,换成TCP(TCP没有这样的限制)如果传输超过64KB的数据,该如何设计?UDP 和TCP 的区别?
2023-08-11 12:05:15
548
32
原创 TCP 协议十大相关特性总结
如果发送方没有接收到回来的ACK相应,等待一段时间后,发送方默认该数据已经丢失,会重新发送该条数据给对方,如果依然没有接收到ACK回应,那么会再次发送 ,但是每次发送的时间间隔会越变越长 , 这就是超时重传。在接收方和发送方里面存在一个"心跳包",双方会周期性发送一个小数据,判断对方是否存活,如果检测到发送方没有心跳回应,那么就默认发送方没了,接收方也就停止接收数据.当TCP发送多条数据,数据都存储再缓冲区中,由于我们的数据是字节流的,所以我们的数据很有可能会粘到一起,无法区分出哪些是一条数据。
2023-08-10 11:21:48
2129
29
原创 网络基本概念
以下图为例,假设要在应用层发送一份邮件,在传输至物理层时,每一层会将该数据包封装成一个新的数据包,其中上层的头部或尾部包含了该层的一些控制信息和协议标识,以便下层能够正确地使用该数据包。以下图为例,假设接收方从物理层接收到一个数据包,那么在经过每一层时,都会将该层的头部和尾部信息去除,直到应用层,此时才能得到原始的邮件数据。有了IP地址和端口号,可以定位到网络中唯一的一个进程,但还存在一个问题,网络通信是基于二进制0/1数据来传输,如何告诉对方发送的数据是什么样的呢?简单说:端口号用于定位主机中的进程。
2023-08-09 21:38:14
665
30
原创 File 类和 InputStream, OutputStream 的用法总结
InputStream 只是一个抽象类,要使用还需要具体的实现类。关于 InputStream 的实现类有很多,基本可以认为不同的输入设备都可以对应一个 InputStream 类,我们现在只关心从文件中读取,所以使用FileInputStream。下面代码是一些普通方法的使用例子。
2023-08-06 22:06:40
552
23
原创 synchronized总结
如果竞争进一步激烈, 自旋不能快速获取到锁状态, 就会膨胀为重量级锁 执行加锁操作, 先进入内核态在内核态判定当前锁是否已经被占用 如果该锁没有占用, 则加锁成功, 并切换回用户态.如果该锁被占用, 则加锁失败. 此时线程进入锁的等待队列, 挂起. 等待被操作系统唤醒.经历了一系列的沧海桑田, 这个锁被其他线程释放了, 操作系统也想起了这个挂起的线程, 于是唤醒 这个线程, 尝试重新获取锁。修饰的类或对象的所有操作都是原子的,因为在执行操作之前必须先获得类或对象的锁,直到执行完才能释放。
2023-08-03 11:31:33
482
7
原创 死锁的成因和解决方案
这段随机的等待时间让其它线程有机会尝试获取相同的这些锁,并且让该应用在没有获得锁的时候可以继续运行(加锁超时后可以先继续运行干点其它事情,再回头来重复之前加锁的逻辑)。如果五位哲学家在完全相同的时刻进入餐厅,并同时拿起左边的餐叉,那么这些哲学家就会等待五分钟,同时放下手中的餐叉,再等五分钟,又同时拿起这些餐叉。吃东西的时候,他们就停止思考,思考的时候也停止吃东西。线程1先获取锁A再获取锁B, 线程2先获取锁B再获取锁A, 线程1在获取锁B的时候等待线程2释放B,同时线程2在获取锁A的时候等待线程1释放A。
2023-08-02 18:11:26
3000
12
原创 HashTable, HashMap, ConcurrentHashMap 总结
HashMap是Java中的一个数据结构,它实现了Map接口。HashMap通过一个哈希表来存储key-value键值对,并且支持高效地添加、删除和查找操作。在HashMap中,key和value可以为任何非空对象,而且可以为null。HashMap的特点包括:快速访问,高效的插入和删除,非线程安全。HashMap也是Java中最常用的集合之一。HashTable是Java中的一个数据结构,也实现了Map接口。它与HashMap相似,都是通过哈希表来存储键值对。然而,HashTable是线程安全的,它的各种
2023-08-02 17:15:48
236
3
原创 总结线程池
线程池是一种线程管理的机制,它维护着多个可重用的线程,在需要时分配线程去处理任务。线程池包含了一个任务队列,用来存放需要执行的任务,以及一个线程集合,用来执行任务。通过使用线程池,可以避免频繁地创建和销毁线程,从而减少了系统资源的消耗,提高了系统的性能和效率。线程池还可以控制任务的执行速度,避免因为任务量过大而导致系统崩溃的情况发生。同时,线程池也可以管理线程的数量,避免线程数量过多,导致系统资源的浪费和线程调度的效率降低。
2023-08-01 12:38:56
263
6
原创 CSS 选择器的常见用法
CSS选择器是一种用于定位HTML(或XML)文档中某些元素的模式,CSS选择器可以根据标记名称、类、ID、属性等特征来选择元素。使用CSS选择器可以方便地对页面元素进行样式设置和操作。常见的CSS选择器包括:- 类选择器:以“.”开头,匹配所有class属性值为指定值的元素。- ID选择器:以“#”开头,匹配所有id属性值为指定值的元素。- 标签选择器:匹配所有指定标记名称的元素。- 通配符选择器:使用的定义选取所有的标签。
2023-07-14 15:05:08
850
3
原创 单例模式 -- 懒汉模式&饿汉模式
懒汉模式是一种单例模式的实现方式,它的特点是在首次访问单例对象时才进行对象的实例化。懒汉模式的优点是可以避免在程序启动时就进行对象的实例化,节省了系统的资源。可能两个线程会同时进行new操作 , 这样我们多线程创建了多个对象 , 就不是单例模式了 , 主要导致该问题的是由于这里面涉及到了对singleton的修改操作,失去了原子性,为了保证原子性,我们想到了加锁,从而实现线程安全问题。饿汉模式是一种单例模式的实现方式,它的特点是在程序启动时就进行对象的实例化。上面的懒汉模式的实现是线程不安全的.
2023-07-13 22:00:04
3231
3
原创 HTML 常用标签用法
html标签是整个html文件的根标签最顶层标签head标签中写页面的属性body标签中写的是页面上显示的内容title标签中写的是页面的标题。
2023-07-11 13:36:34
237
2
原创 线程安全问题的原因和解决方案
循环了很多次 此时我们的编译器便做出了优化 ,不再重复读取内存上的值 ,只读取一次放在CPU中 , 这样过后我们的t2即便改变了flog的值 , 但是由于t1不在读取内存上的值 , 所以我们的循环没有停下来, 此时,volatile就能发挥作用了。如果一个进程或线程正在执行时,出现了一些特殊情况(如I/O请求、中断请求等),操作系统就会暂时中止当前进程或线程的执行,切换到其他进程或线程的执行,以便处理这些请求。我们的预期是,当t2修改了flog的值之后,使flog不再为0,此时跳出循环,线程t1结束。
2023-07-10 17:38:08
183
4
原创 Java 线程的几种状态
:当线程因为某些原因无法运行时,例如等待某个资源、等待 IO 完成等,它处于阻塞状态。如果调用 sleep()、 suspend()、 wait()等方法,线程都将进入堵塞状态。就绪状态(READY):当线程已经准备好被调度执行,但是当前没有分配到 CPU 时间片时,它处于就绪状态。):当线程对象被创建时,它处于新建状态,此时系统已经为该线程分配了必要的资源,例如线程栈等。):当线程因为某个条件而需要等待时,例如等待某个锁、等待某个信号量等,它处于等待状态。3、造成线程阻塞后,线程回到哪个状态了?
2023-07-10 15:30:45
160
4
原创 Thread类的基本用法
所以此时如果我们想让新线程先执行 我们就需要使用Thread类的join方法,这个方法是可以规定哪一个线程先执行的,还是这个代码我们在主线程中加一行代码,就可以让新的线程先执行,新的线程执行完然后执行主线程,注意,哪个在哪个线程中加入这个方法,就是让线程进行等待(阻塞状态)在上面这个代码中 ,创建了一个新线程,那先执行新的线程还是执行主线程,答案是不确定,先执行谁都是有可能的,此时的新线程和主线程是并发(并行+并发)执行的,而系统的调度是无序的,所以先执行哪一个线程都有可能。在这种方法中,等待线程调用。
2023-07-09 22:51:27
149
2
原创 进程和线程的区别和联系
进程是操作系统资源分配的基本单位, 进程是指正在运行的程序实例。每个进程都有自己的内存空间、代码、数据和资源。操作系统通过管理进程来控制计算机的资源分配。每个进程都有一个唯一的标识符,称为进程 ID,以便操作系统可以识别和管理它。进程可以与其他进程通信,并且可以启动其他进程以执行不同的任务。。
2023-07-08 21:46:09
134
1
原创 基于Java数组实现循环队列
重点:循环队列,无论使用数组实现还是链表实现,都要多开一个空间,也就意味着,要是一个存k个数据的循环队列,要开k+1个空间,否则无法实现判空和满。
2023-05-29 19:30:32
643
7
原创 JAVA简单实现单链表
以下是一个单链表的简单实现 将以图形和代码的形式进行描述以上就是今天要讲的内容,本文仅仅简单介绍了单链表的一些方法的实现.
2023-05-16 23:23:52
369
3
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人