Java中常用的七种队列你了解多少?
文章目录
- Java中常用的七种队列你了解多少?
- ArrayBlockingQueue队列如何使用?
- 添加元素到队列
- 获取队列中的元素
- 遍历队列
- LinkedBlockingQueue队列如何使用?
- 1. 创建SynchronousQueue对象
- 2. 添加元素到队列
- 3. 获取队列中的元素
- 4. 遍历队列
- SynchronousQueue队列如何使用?
- 创建SynchronousQueue对象
- 添加元素到队列
- 获取队列中的元素
- 遍历队列
- LinkedTransferQueue队列如何使用?
- 1. 创建LinkedTransferQueue对象
- 2. 添加元素到队列
- 3. 获取队列中的元素
- 4. 遍历队列
- ConcurrentLinkedQueue队列如何使用?
- 1. 创建DelayQueue对象
- 2. 添加元素到DelayQueue
- 3. 获取DelayQueue中的元素
- 4. 自定义元素类
- DelayQueue队列如何使用?
- 创建DelayQueue对象
- 添加元素到DelayQueue
- 获取DelayQueue中的元素
- 总结:
- 结语
Java中常用的七种队列你了解多少?
Java中常用的队列有以下几种:
ArrayBlockingQueue:一个基于数组结构的有界阻塞队列,按照先进先出的原则对元素进行排序。LinkedBlockingQueue:一个基于链表结构的有界阻塞队列,按照先进先出的原则对元素进行排序。PriorityBlockingQueue:一个支持优先级排序的无界阻塞队列。DelayQueue:一个支持延时获取元素的无界阻塞队列。SynchronousQueue:一个不存储元素的阻塞队列,每个插入操作必须等待另一个线程的移除操作,否则插入操作一直处于阻塞状态。LinkedTransferQueue:一个基于链表结构的无界阻塞队列,支持生产者消费者模式。ConcurrentLinkedQueue:一个基于链表结构的无界并发队列,按照先进先出的原则对元素进行排序。
这些队列都实现了Queue接口或其子接口,可以根据不同的场景和需求选择合适的队列。在并发场景下,应当注意队列的线程安全性以及对并发操作的支持程度。
ArrayBlockingQueue队列如何使用?
ArrayBlockingQueue是Java中的一个线程安全的队列,它是一种基于数组实现的有界队列。下面介绍一下ArrayBlockingQueue队列的使用方法。
创建ArrayBlockingQueue对象
可以使用new关键字创建ArrayBlockingQueue对象。
ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(capacity);
其中,capacity参数表示队列的容量。
添加元素到队列
可以使用add方法向队列中添加元素,如果队列已满,则会抛出IllegalStateException异常。
queue.add("wx:libin9iOak");
也可以使用offer方法向队列中添加元素,如果队列已满,则返回false。
boolean result = queue.offer("wx:libin9iOak");
还可以使用put方法向队列中添加元素,如果队列已满,则当前线程会被阻塞,直到有其他线程从队列中删除元素。
queue.put("wx:libin9iOak");
获取队列中的元素
可以使用take方法获取队列中的元素,如果队列为空,则当前线程会被阻塞,直到有其他线程向队列中添加元素。
String element = queue.take();
也可以使用poll方法获取队列中的元素,如果队列为空,则返回null。
String element = queue.poll();
还可以使用poll方法设置超时时间,如果在指定的时间内没有获取到元素,则返回null。
String element = queue.poll(timeout, unit);
遍历队列
可以使用迭代器遍历队列中的元素。
Iterator<String> iterator = queue.iterator();
while(iterator.hasNext()) {String element = iterator.next();// do something with the element
}
也可以使用for-each循环遍历队列中的元素。
for(String element : queue) {// do something with the element
}
ArrayBlockingQueue在生产者线程和消费者线程之间提供了一种同步交互的机制,能够有效地控制线程之间的交互。同时,由于它是一种有界队列,因此在使用时需要注意队列的容量,以免发生队列溢出。
LinkedBlockingQueue队列如何使用?
SynchronousQueue是Java中的一个线程安全的队列,它是一种没有缓冲的队列,其中每个插入操作必须等待另一个线程的删除操作,反之亦然。下面介绍一下SynchronousQueue队列的使用方法。
1. 创建SynchronousQueue对象
可以使用new关键字创建SynchronousQueue对象。
SynchronousQueue<String> queue = new SynchronousQueue<>();
2. 添加元素到队列
SynchronousQueue是一种没有缓冲的队列,因此不能直接将元素添加到队列中。它的插入操作必须等待另一个线程的删除操作。可以使用put方法向队列中添加元素,如果没有等待的消费者线程,则当前线程会被阻塞,直到有消费者线程来获取元素。
queue.put("wx:libin9iOak");
3. 获取队列中的元素
可以使用take方法获取队列中的元素,如果队列为空,则当前线程会被阻塞,直到有生产者线程添加元素。
String element = queue.take();
4. 遍历队列
SynchronousQueue是一种没有缓冲的队列,因此不支持遍历操作。
SynchronousQueue在生产者线程和消费者线程之间提供了一种同步交互的机制,能够有效地控制线程之间的交互。但是需要注意的是,由于它是一种没有缓冲的队列,因此在使用时需要确保生产者线程和消费者线程之间的数量平衡,否则可能会导致线程阻塞或队列溢出。
Regenerate response
SynchronousQueue队列如何使用?
SynchronousQueue是Java中的一个线程安全的队列,它是一种没有缓冲的队列,其中每个插入操作必须等待另一个线程的删除操作,反之亦然。下面介绍一下SynchronousQueue队列的使用方法。
创建SynchronousQueue对象
可以使用new关键字创建SynchronousQueue对象。
```
SynchronousQueue queue = new SynchronousQueue<>();
```
添加元素到队列
SynchronousQueue是一种没有缓冲的队列,因此不能直接将元素添加到队列中。它的插入操作必须等待另一个线程的删除操作。可以使用put方法向队列中添加元素,如果没有等待的消费者线程,则当前线程会被阻塞,直到有消费者线程来获取元素。
```
queue.put(“wx:libin9iOak”);
```
获取队列中的元素
可以使用take方法获取队列中的元素,如果队列为空,则当前线程会被阻塞,直到有生产者线程添加元素。
```
String element = queue.take();
```
遍历队列
SynchronousQueue是一种没有缓冲的队列,因此不支持遍历操作。
SynchronousQueue在生产者线程和消费者线程之间提供了一种同步交互的机制,能够有效地控制线程之间的交互。但是需要注意的是,由于它是一种没有缓冲的队列,因此在使用时需要确保生产者线程和消费者线程之间的数量平衡,否则可能会导致线程阻塞或队列溢出。
LinkedTransferQueue队列如何使用?
LinkedTransferQueue是Java中的一个线程安全的队列,它是基于链表实现的无界队列,支持高效的并发访问。相比于ConcurrentLinkedQueue,它多了一种阻塞等待的机制。下面介绍一下LinkedTransferQueue队列的使用方法。
1. 创建LinkedTransferQueue对象
可以使用new关键字创建LinkedTransferQueue对象。
LinkedTransferQueue<String> queue = new LinkedTransferQueue<>();
2. 添加元素到队列
可以使用add、offer或transfer方法将元素添加到队列中。
queue.add("wx:libin9iOak");
queue.offer("weix:libin9iOak");
queue.transfer("element3");
其中,add方法在队列已满时会抛出异常,而offer方法则会返回false。而transfer方法则是一种阻塞等待的机制,它会将元素立即转移给等待的消费者线程,如果没有等待的消费者线程,则当前线程会被阻塞,直到有消费者线程来获取元素。
3. 获取队列中的元素
可以使用poll方法获取队列中的元素,如果队列为空,则返回null。
String element = queue.poll();
也可以使用take方法获取队列中的元素,如果队列为空,则当前线程会被阻塞,直到有生产者线程添加元素。
String element = queue.take();
4. 遍历队列
可以使用forEach方法遍历队列中的元素。
queue.forEach(System.out::println);
也可以使用迭代器遍历队列中的元素。
Iterator<String> iterator = queue.iterator();
while (iterator.hasNext()) {System.out.println(iterator.next());
}
LinkedTransferQueue支持高效的并发访问,并且它提供了一种阻塞等待的机制,可以更加灵活地控制线程之间的交互。但是需要注意的是,由于它是基于链表实现的,因此在进行遍历或删除操作时,需要注意多线程并发修改的问题。
ConcurrentLinkedQueue队列如何使用?
DelayQueue是Java中的一个阻塞队列,它可以支持延时获取元素的功能。在DelayQueue中,每个元素都有一个过期时间,只有当元素的过期时间到了才能被获取,否则元素一直处于阻塞状态。下面介绍一下DelayQueue队列的使用方法。
1. 创建DelayQueue对象
可以使用new关键字或者工具类Executors创建DelayQueue对象。
DelayQueue<MyDelayedElement> delayQueue = new DelayQueue<>();
其中MyDelayedElement是自定义的实现了Delayed接口的元素类,实现getDelay方法用于返回元素的过期时间。
2. 添加元素到DelayQueue
可以使用add或offer方法将元素添加到DelayQueue中。
delayQueue.add(new MyDelayedElement("wx:libin9iOak", 1000));
delayQueue.offer(new MyDelayedElement("weix:libin9iOak", 2000));
其中,第二个参数是元素的过期时间,单位为毫秒。
3. 获取DelayQueue中的元素
可以使用take方法获取DelayQueue中的元素,如果没有可用的元素,则线程会一直处于阻塞状态。
MyDelayedElement element = delayQueue.take();
也可以使用poll方法获取DelayQueue中的元素,如果没有可用的元素,则返回null。
MyDelayedElement element = delayQueue.poll();
4. 自定义元素类
MyDelayedElement是一个自定义的实现了Delayed接口的元素类,下面是一个简单的示例代码。
public class MyDelayedElement implements Delayed {private String name; // 元素名称private long expireTime; // 过期时间public MyDelayedElement(String name, long delay) {this.name = name;this.expireTime = System.currentTimeMillis() + delay;}// 获取元素的过期时间@Overridepublic long getDelay(TimeUnit unit) {long diff = expireTime - System.currentTimeMillis();return unit.convert(diff, TimeUnit.MILLISECONDS);}// 按照过期时间排序@Overridepublic int compareTo(Delayed other) {long diff = this.getDelay(TimeUnit.MILLISECONDS) - other.getDelay(TimeUnit.MILLISECONDS);return Long.compare(diff, 0);}// 元素业务逻辑public void doBusiness() {System.out.println("Element " + name + " has expired");}
}
在上面的示例代码中,元素的过期时间是由创建元素时指定的delay参数和当前时间计算得出的。在getDelay方法中,返回元素的过期时间与指定时间单位的差值,这个差值会用于元素的排序。在compareTo方法中,按照过期时间从小到大排序。在doBusiness方法中,执行元素的业务逻辑。
总之,DelayQueue可以用于实现一些延时操作,例如定时任务调度、缓存失效等。在使用时,需要注意元素的过期时间和业务逻辑的处理。
DelayQueue队列如何使用?
DelayQueue是Java中的一个阻塞队列,它可以支持延时获取元素的功能。在DelayQueue中,每个元素都有一个过期时间,只有当元素的过期时间到了才能被获取,否则元素一直处于阻塞状态。下面介绍一下DelayQueue队列的使用方法。
创建DelayQueue对象
可以使用new关键字或者工具类Executors创建DelayQueue对象。
DelayQueue<MyDelayedElement> delayQueue = new DelayQueue<>();
其中MyDelayedElement是自定义的实现了Delayed接口的元素类,实现getDelay方法用于返回元素的过期时间。
添加元素到DelayQueue
可以使用add或offer方法将元素添加到DelayQueue中。
delayQueue.add(new MyDelayedElement("wx:libin9iOak", 1000));
delayQueue.offer(new MyDelayedElement("weix:libin9iOak", 2000));
其中,第二个参数是元素的过期时间,单位为毫秒。
获取DelayQueue中的元素
可以使用take方法获取DelayQueue中的元素,如果没有可用的元素,则线程会一直处于阻塞状态。
MyDelayedElement element = delayQueue.take();
也可以使用poll方法获取DelayQueue中的元素,如果没有可用的元素,则返回null。
MyDelayedElement element = delayQueue.poll();
自定义元素类
MyDelayedElement是一个自定义的实现了Delayed接口的元素类,下面是一个简单的示例代码。
public class MyDelayedElement implements Delayed {private String name; // 元素名称private long expireTime; // 过期时间public MyDelayedElement(String name, long delay) {this.name = name;this.expireTime = System.currentTimeMillis() + delay;}// 获取元素的过期时间@Overridepublic long getDelay(TimeUnit unit) {long diff = expireTime - System.currentTimeMillis();return unit.convert(diff, TimeUnit.MILLISECONDS);}// 按照过期时间排序@Overridepublic int compareTo(Delayed other) {long diff = this.getDelay(TimeUnit.MILLISECONDS) - other.getDelay(TimeUnit.MILLISECONDS);return Long.compare(diff, 0);}// 元素业务逻辑public void doBusiness() {System.out.println("Element " + name + " has expired");}}
在上面的示例代码中,元素的过期时间是由创建元素时指定的delay参数和当前时间计算得出的。在getDelay方法中,返回元素的过期时间与指定时间单位的差值,这个差值会用于元素的排序。在compareTo方法中,按照过期时间从小到大排序。在doBusiness方法中,执行元素的业务逻辑。
总之,DelayQueue可以用于实现一些延时操作,例如定时任务调度、缓存失效等。在使用时,需要注意元素的过期时间和业务逻辑的处理。
总结:
ArrayBlockingQueue是一种有界队列,它可以设定最大容量,当队列满时,新增元素会被阻塞;LinkedBlockingQueue是一种无界队列,它将新增元素放在队列的尾部,获取元素时从队列的头部开始获取;PriorityBlockingQueue是一种带有优先级的队列,它会根据元素的优先级顺序来进行排序;LinkedTransferQueue是一种基于链表实现的无界队列,它支持高效的并发访问,并且它提供了一种阻塞等待的机制;
ConcurrentLinkedQueue是一种基于链接节点的无界线程安全队列,支持高性能的并发操作。

结语
如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、评论、收藏➕关注,您的支持是我坚持写作最大的动力。
相关文章:
Java中常用的七种队列你了解多少?
文章目录Java中常用的七种队列你了解多少?ArrayBlockingQueue队列如何使用?添加元素到队列获取队列中的元素遍历队列LinkedBlockingQueue队列如何使用?1. 创建SynchronousQueue对象2. 添加元素到队列3. 获取队列中的元素4. 遍历队列SynchronousQueue队列…...
<Java获取时间日期工具类>常见八种场景(一)
一:自定义时间日期工具类常用的八种方式(整理): 0,getTimeSecondNum:时间日期转成秒数,常用于大小比较 1,getLastYearMonthLastDay:获取去年当月最后一天的时间日期 2,getLastYearM…...
接上一篇 对多个模型环形旋转进行优化 指定旋转位置
using System.Collections; using System.Collections.Generic; using UnityEngine; using DG.Tweening; public class ModelAnimal : MonoBehaviour { //记录鼠标滑动 public Vector2 lastPos;//鼠标上次位置 Vector2 currPos;//鼠标当前位置 Vector2 offset;//两次位置的偏移…...
Unity中获取地形的法线
序之前,生成了地形图:(42条消息) 从灰度图到地形图_averagePerson的博客-CSDN博客那末,地形的法线贴图怎么获取?大概分为两个部分吧,先拿到法线数据,再画到纹理中去。关于法线计算Unity - Scripting API: M…...
模型解释性:PFI、PDP、ICE等包的用法
本篇主要介绍几种其他较常用的模型解释性方法。 1. Permutation Feature Importance(PFI) 1.1 算法原理 置换特征重要性(Permutation Feature Importance)的概念很简单,其衡量特征重要性的方法如下:计算特征改变后模型预测误差的增加。如果打乱该特征的…...
spring常见面试题(2023最新)
目录前言1.spring是什么2.spring的设计核心是什么3.IOC和AOP面试题4.spring的优点和缺点5.spring中bean的作用域6.spring中bean的注入方式7.BeanFactory 和 ApplicationContext有什么区别?8.循环依赖的情况,怎么解决?9.spring中单例Bean是线程…...
华为OD机试题,用 Java 解【压缩报文还原】问题
最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…...
机器学习-BM-FKNCN、BM-FKNN等分类器对比实验
目录 一、简介和环境准备 二、算法简介 2.1四种方法类: 2.1.1FKNN 2.1.2FKNCN 2.1.3BM-FKNN 2.1.3BM-FKNCN 2.2数据预处理 2.3输出视图 2.4调用各种方法看准确率 2.4.1BM-FKNCN 2.4.2BM-FKNN 2.4.3FKNCN 2.4.4FKNN 2.4.5KNN 一、简介和环境准备 k…...
ChatGPT火了,对话式人工智能还能干嘛?
身兼数职的ChatGPT 从2022火到了2023 连日来一直是各大平台的热议对象 其实除了写诗、敲代码、处理文档 以ChatGPT为代表的 对话式人工智能 还有更重要的工作要做 对话式AI与聊天机器人 相信大多数人…...
十一、操作数栈的特点(Operand Sstack)
1.每一个独立的栈帧中除了包含局部变量表以外,还包含一个后进先出的操作数栈,也可以称之为表达式栈。 2.操作数栈,在方法执行过程中,根据字节码指令,往栈中写入数据,或提取数据,即入栈ÿ…...
拆解瑞幸新用户激活流程,如何让用户“动”起来?
Aha时刻 一个产品的拉新环节,是多种方式并存的;新用户可能来自于商务搭建了新的渠道,运营策划了新的活动,企划发布了新的广告,销售谈下了新的客户,市场推广了新的群体,以及产品本身的口碑传播,功能更新带来的自然流量。 这是一个群策群力的环节,不同的团队背负不同的K…...
tkinter界面的TCP通信/开启线程等待接收数据
前言 用简洁的语言写一个可以与TCP客户端实时通信的界面。之前做了一个项目是要与PLC进行信息交互的界面,在测试的时候就利用TCP客户端来实验,文末会附上TCP客户端。本文分为三部分,第一部分是在界面向TCP发送数据,第二部分是接收…...
华为OD机试题,用 Java 解【任务混部】问题
最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…...
看linux内核启动流程需要的汇编指令解释
一、指令 0.MRS 和MSR MRS 指令: 对状态寄存器CPSR和SPSR进行读操作。 MSR指令: 对状态寄存器CPSR和SPSR进行写操作。 1.adrp adrp x0, boot_args把boot_args的页基地址提取出来,放到x0中。 2.stp stp x21, x1, [x0]将 x21, x1 的值存入 x0寄存器记录的地址中…...
【巨人的肩膀】JAVA面试总结(二)
1、💪 目录1、💪1.0、什么是面向对象1.1、JDK、JRE、JVM之间的区别1.2、什么是字节码1.3、hashCode()与equals()之间的联系1.4、String、StringBuffer、StringBuilder的区别1.5、和equals方法的区别1.6、重载和重写的区别1.7、List和Set的区别1.8、Array…...
【网络安全入门】零基础小白必看!!!
看到很多小伙伴都想学习 网络安全 ,让自己掌握更多的 技能,但是学习兴趣有了,却发现自己不知道哪里有 学习资源◇瞬间兴致全无!◇ 😄在线找人要资料太卑微,自己上网下载又发现要收费0 🙃差点当…...
字节前端经典面试题(附答案)
有哪些可能引起前端安全的问题? 跨站脚本 (Cross-Site Scripting, XSS): ⼀种代码注⼊⽅式, 为了与 CSS 区分所以被称作 XSS。早期常⻅于⽹络论坛, 起因是⽹站没有对⽤户的输⼊进⾏严格的限制, 使得攻击者可以将脚本上传到帖⼦让其他⼈浏览到有恶意脚本的⻚⾯, 其注⼊⽅式很简…...
数据库管理工具的使用
目录 摘要 一、Navicat是什么? 二、使用步骤 1.如何下载与安装 2.如何连接远程数据库 总结 摘要 本文主要介绍数据库管理工具的使用 一、Navicat是什么? 它是一款数据库管理工具,将此工具连接数据库,你可以从中看到各种数据库的详细…...
让马斯克反悔的毫米波雷达,被国产雷达头部厂商木牛科技迭代到了5D时代
近日,特斯拉或将在其HW4.0硬件系统配置一枚高精度4D毫米波雷达的消息在外网刷屏。据分析,“纯视觉”信仰者马斯克之所以做出这样的决定,一方面是减配了雷达的特斯拉自动驾驶,表现不尽如人意;另一方面也跟毫米波雷达的技…...
MaxWell原理概述
文章目录1.MaxWell概述2.Maxwell输出数据格式3.Maxwell原理3.1 MySQL二进制日志3.2 MySQL主从复制1.MaxWell概述 Maxwell 是由美国Zendesk公司开源,用Java编写的MySQL变更数据抓取软件。它会实时监控Mysql数据库的数据变更操作(包括insert、update、dele…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
