当前位置: 首页 > news >正文

并发编程-

一、简述

线程:线程是cpu可执行的最小单位,而进程是操作系统可分配的最小资源单位。一个进程中可以有多个线程。

线程的五个状态:
新建(new Thread())
就绪 (thread.start())
运行(cpu开始执行该线程)
阻塞(线程在等待获得锁)
销毁(线程执行完毕或出现异常)。

创建线程:
1.继承Thread类并重写run方法
2.实现runnable接口并重写run方法
3.实现callable接口并重写call方法
        call方法和run方法不同之处在于,run方法时无返回值的,call方法有返回值,是个泛型。
4.使用线程池

二、多线程

并发执行:所谓的并发执行就是多个线程交替执行。
并发执行的优点:

        1.多个线程共享资源,可以减少内存的加载和释放,从而提高执行效率
        2.多个线程因为操作系统的调度可能会被分配到不同的cpu核心上执行,更好的利用了多核处理器的资源,从而提升了程序的可扩展性。

并发执行遇到的问题:

1.不可见性:

        由于Java内存模型(JMM)的原因,JMM分为主内存区和本地内存区,每个线程都会有自己的本地内存区。多核处理器允许多个线程并行执行在不同的核心上,如果多个线程同时对主内存区中的数据进行操作,就需要现将其加载到该线程的本地内存区中,当第一个线程对数据修改完写回到本地内存后,第二个线程不知道本地内存中的数据已经被修改,此时就会导致堆数据的操作出现错误。

2.乱序性

        为了优化性能,有时候cpu会将后面的指令提前执行,这样指令的运行顺序就被打乱了。

3.非原子性

        cpu执行指令,指令是原子性的,但是高级语言的语句却是非原子性的,一条高级语句往往可以拆成多条指令。非原子性就会导致线程交叉操作,使得结果错误。

总结:java缓存模型导致了不可见性。编译器优化导致了乱序性。线程交换导致了非原子性。

4.解决方法:

1.volatile关键字

volatile关键字对共享变量修饰后
1.该变量一旦被线程修改,对其他线程来说是立即可见的。
2.禁止了指令的重排序
3.仍不能解决非原子性

2.如何保证原子性
2.1synchronized锁

        synchronized锁是一种独占锁,因此只有持有锁的线程才能被执行,虽然不能阻止线程交换,但是当其他线程想要执行时,会因为没有锁而阻塞,变相的保证了原子性。

2.2原子类

        该方式是以volatile+CAS来实现的,volatile保证了主内存数据的可见性,而CAS即比较和交换,在具体实现中,当多个线程对同一数据进行操作,当一个线程加载主内存的数据到对本地内存时,此时会对该数据记录此时的值为预期值,当对数据进行修改后,写回到主内存区之前会对预期值和当前主内存区的值进行比较,如果已被更改就重新进行修改操作。

CAS缺点:CAS使用自旋锁的方式,由于该锁会不断循环判断,因此不会类似synchronize 线程阻塞导致线程切换。但是不断的自旋,会导致CPU的消耗,在并发量大的时候容易导致CPU跑满。

5.Java中的锁分类

1.乐观锁/悲观锁

        乐观锁和悲观锁并非是真实存在的锁,而是一种思想。
        乐观锁认为多线程开发中不需要加锁,例如使用原子类,采用不加锁的方式解决问题。
        悲观锁认为多线程开发中一定要加锁,否则会出现问题。

2.可重入锁

        可重入锁又名递归锁,是指在外层方法获得锁后,进入内层方法后会再次获得锁。reentrantlock就是可重入锁。reentrantlock锁可以避免死锁。

3.读写锁

        读写锁有以下特点,多个线程同时读取数据时不会互斥,但是一旦有线程进行写操作,就会互斥,阻止该操作。

4.共享锁/独占锁

        共享锁是允许多个获得该锁的线程,在不发生写操作的前提下,可以同时对数据进行读取操作。而独占锁一次只允许一个线程进入锁代码块中。

5.分段锁

        分段锁也是一种思想,主张将数据分段,在每个分段上都加锁,以提高并发效率。如ConcurrentHashMap,ConcurrentHashMap底层哈希表有16个空间,可以用每一个位置上的第一个节点当做锁,这样可以同时由不同的线程操作不同的位置,只是同一个位置多个线程不能同时操作。

6.自旋锁

        自旋锁是指,在线程进行抢锁的过程中,如果没抢到锁会多次进行抢锁操作,实在抢不到锁才会将该线程阻塞。但是自旋过程中不会释放cpu资源,因此比较耗费cpu,但是在低并发情况下会有较高的效率。

7.公平锁/非公平锁

        公平锁是指按照请求锁的顺序分配,拥有稳定获得锁的机会。
        非公平锁是指不按照请求锁的顺序分配,不一定拥有获得锁的机会。

8.偏向锁/ 轻量级锁/重量级锁

锁的状态:无锁,偏向锁,轻量级锁、重量级锁
无锁状态: 没有任何线程获取锁
偏向锁状态: 偏向锁是指一段同步代码一直被一个线程所访问,那么该线程会自动获取锁。 降低获取锁的代价。
轻量级锁状态: 当锁状态为偏向锁时, 继续有其他线程过来获取锁,锁状态升级为轻量级锁,线程不会进入到阻塞状态,一直自旋获得锁。
重量级锁状态: 当锁状态为轻量级锁时, 线程数量持续增多,且线程自旋次数到一定数量时,锁状态升级为重量级锁,线程会进入到阻塞状态,等待操作系统调度执行。

6.synchronized锁实现

        synchronized锁相当于一个监视器,当线程进入锁修饰的代码块或方法中时,就会自动获得锁,其他线程再访问该方法/代码块时就会阻塞,直到有锁的线程运行完毕或被wait,释放了锁。

1.原子性:synchronized锁不能同时加到多个线程上,因此其保证了操作的原子性。
2.可见性:synchronized锁会在线程释放锁后才会将本地内存中的数据刷新到主内存中。等到其他线程从主内存中读取数据时,已经被最新的值了。
3.有序性:synchronized锁会阻止操作系统对线程中的指令进行重排序,以确保操作的有序性

synchronized控制同步,是依靠底层的指令实现的.
如果是同步方法,在指令中会为方法添加ACC_SYNCHRONIZED标志
如果是同步代码块,在进入到同步代码块时,会执行monitorenter, 离开同步代码块时或者出异常时,执行monitorexit

7.AQS(AbstractQueuedSynchronizer)

抽象同步队列,并发包中很多类的底层都用到了AQS,在该队列中,将线程放到Node类中的thread变量上。

class AbstractQueuedSynchronizer {private transient volatile Node head;private transient volatile Node tail;private volatile int state; //表示有没有线程访问共享数据  默认是0 表示没有线程访问//修改状态的方法(CAS)protected final boolean compareAndSetState(int expect, int update) {return unsafe.compareAndSwapInt(this, stateOffset, expect, update);}static final class Node {volatile Node prev;volatile Node next;volatile Thread thread;}}

Reentrantlock

Reentrantlock类公平锁和非公平锁都可以实现,可以对资源进行共享同步,和synchronized一样是支持可重入的。其内部有三个类Sync、FairSync、NonfairSync

 class ReentrantLock{abstract static class Sync extends AbstractQueuedSynchronizer {abstract void lock();}//非公平锁static final class NonfairSync extends Sync {void lock(){}}//公平锁static final class FairSync extends Sync {void lock(){}}}
7.1获取锁的时机(acquire()调用时机)

1.线程被唤醒
2.调用lock方法
3.线程在同步队列中等待,直到被前驱节点唤醒或者轮到自己尝试获取锁。

7.2公平锁和非公平锁

线程进队列时,如果是公平锁,则会默默等待前驱结点被唤醒或轮到自己尝试获取锁。而在非公平锁中,线程进来会调用方法比较当前锁的状态是否为0,如果是为其设置状态为1

ReentrantLock中,acquire方法的作用是尝试获取锁。如果获取锁成功,则当前线程获得锁并继续执行;如果获取锁失败,则当前线程会被加入到同步队列中等待。

8.JUC常用类

8.1ConcurrentHashMap

        该类相比HashMap的优点在于,相对于HashMap而言是线程安全的;相对于HashTable是高效的,原因在于,他加synchronized锁方式是分段锁(JDK5-7之前),在JDK8以后是在哈希表中每个位置的头一个元素上加锁,这样如果多个线程如果操作不同的位置,那么相互不影响,只有多个线程操作同一个位置时,才会等待,如果位置上没有任何元素,那么采用cas机制插入数据到对应的位置。
        ConcurrentHashMap中的元素键和键值都不可以为null,这是为了防止产生歧义,如

          map.put("b","b")System.out.println(map1.get("a"));//null  值是null  还是键不存在返回nullmap.put("a",null)
8.2CopyOnWriteArrayList

        CopyOnWriteArrayList 是对写方法加了Reentrantlock锁,他的效率比Vector高,一是因为读取数据没有了锁,多个线程就可同时对数据进行读操作。而写操作不会直接在原数组上修改,是先复制一个数组,然后对复制出来的数组进行修改,最后将底层数组切换为新的数组。
        因此CopyOnWriteArrayList写的效率较低,适合高并发读多写少的情况。但是因写方法的特殊性,CopyOnWriteArrayList可以在迭代过程中直接对集合的底层数组进行修改,而不需要使用迭代器的对象对数组修改。普通数组如果在迭代过程中对集合底层数组进行修改,java为了保证迭代操作的一致性和安全性,会禁止该操作,抛出ConcurrentModificationException异常。

9.线程池

        在高并发过程中,频繁地创建线程和销毁线程都会大大降低运行的效率,因此在jdk5引入了线程池,一般使用ThreadPoolExecutor来创建线程池。

 public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler)
9.1线程池中的参数

        corePollSize:记录核心线程池的线程最大数量
        maximumPollSize:记录线程池中的线程最大数量(包含核心线程池中的线程数)
        keepAliveTime:记录非核心线程池中的空闲线程的空闲生命,如果非核心线程池中的线程长时间未被调用,就会被销毁。
        unit:时间单位
        workQueue:等待队列,当核心线程池中的线程都在被使用时,如果再进来新的任务,就会存放在等待队列中,如果等待队列也满了,就会在非核心线程池中创建新的线程。
        threadFactory:线程工厂,负责创建新的线程。
        handler:拒绝策略,当核心线程池和非核心线程池中的线程都在使用中,且等待队列也已经满了,此时会执行拒绝策略。

9.2线程池工作流程

        当有任务进入线程池,如果核心线程池中有空闲的线程,就交给核心线程池中的线程执行。否则判断等待队列是否有空,如果有则放进等待队列,否则判断非核心线程池是否还有容量,如果有就使用线程工厂创建新的线程来执行该任务,否则执行拒绝策略。

9.3四种拒绝策略

AbortPolicy: 抛异常
CallerRunsPolicy: 将新来的线程交给提交任务的线程去执行
DiscardOldestPolicy: 丢弃等待时间最长的任务
DiscardPolicy: 丢弃最后的任务

9.4提交任务的方法

        执行任务除了可以使用execute方法和submit方法。它们的主要区别 是:execute没有返回值,而submit会有返回值。

9.5关闭线程池

shutdown(),执行该方法后,会停止接收新的任务,会将线程池中的所有任务执行完毕再彻底关闭线程池。
shutdownNow(),执行该方法后会立刻关闭线程池,正在执行的任务也会停止。

10.ThreadLocal

10.1介绍

        ThreadLocal是本地线程变量,他会为每个线程设置一个本地变量,初始值由ThreadLocal构造器生成。本地线程变量只在当前线程中使用,每个线程之间的本地变量是没有关系的。

        ThreadLocal会为每个线程创建ThreadLocalMap对象来储存值,ThreadLocalMap的默认值便是初始化ThreadLocal对象时的值。

    static ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>(){@Overrideprotected Integer initialValue() {return 123;  将每个线程中的ThreadLocalMap的值设置为123}};public static void main(String[] args) {new Thread(()->{System.out.println("1: "+threadLocal.get()); //123threadLocal.set(10);System.out.println("2: "+threadLocal.get()); //10}).start();new Thread(()->{System.out.println("3: "+threadLocal.get()); //123threadLocal.set(20);System.out.println("4: "+threadLocal.get()); //20}).start();new Thread(()->{System.out.println("5: "+threadLocal.get()); //123threadLocal.set(30);System.out.println("6: "+threadLocal.get()); //30}).start();System.out.println("7: "+threadLocal.get()); //123threadLocal.remove();//回收threadlocal变量,防止内存泄漏}
10.2threadLocal的内存泄漏问题

        ThreadLocalMap变量中,键是弱引用,而值是强引用,当GC时一定会将其键回收掉,就会导致有值无键的结果,从而产生内存泄漏。对于该问题,我们需要在使用完ThreadLocal后调用其remove()方法将其回收。

对象引用分为四种:

强引用

Object obj = new Object(); 强引用

obj.hashCode();

obj=null; 没有引用指向对象

对象如果有强引用关联,那么肯定是不能被回收的

软引用

被SoftReference类包裹的对象, 当内存充足时,不会被回收,当内存不足时,即使有引用指向,也会被回收

 Object o1 = new Object();SoftReference<Object> softReference = new SoftReference<Object>(o1);

弱引用

被WeakReference类包裹的对象,只要发送垃圾回收,该类对象都会被回收掉,不管内存是否充足

Object o1 = new Object();WeakReference<Object> weakReference = new WeakReference<Object>(o1);

ThreadLocal 被弱引用管理static class Entry extends WeakReference<ThreadLocal<?>> {}

当发生垃圾回收时,被回收掉,但是value还与外界保持引用关系,不能被回收. 造成内存泄漏

threadLocal.remove();//不再使用时,调用remove方法,删除键值对,可以避免内存泄漏问题

虚引用

被PhantomReference类包裹的对象,随时都可以被回收,

通过虚引用对象跟踪对象回收的状态

相关文章:

并发编程-

一、简述 线程&#xff1a;线程是cpu可执行的最小单位&#xff0c;而进程是操作系统可分配的最小资源单位。一个进程中可以有多个线程。 线程的五个状态&#xff1a; 新建&#xff08;new Thread()&#xff09; 就绪 &#xff08;thread.start()&#xff09; 运行&#xff08…...

Mac中nvm切换node版本失败,关闭终端再次打开还是之前的node

Mac中使用 nvm 管理 node 版本&#xff0c;在使用指令&#xff1a;nvm use XXX 切换版本之后。 关闭终端&#xff0c;再次打开&#xff0c;输入 node -v 还是得到之前的 node 版本。 原因&#xff1a; 在这里这个 default 中有个 node 的版本号&#xff0c;使用 nvm use 时&a…...

C语言(25)

一.数据在内存中的存储 1.整数在内存中的存储 整数在内存中以二进制的形式储存&#xff0c;分别为原码&#xff0c;补码&#xff0c;反码 有符号的整数&#xff0c;在上述三种形式都有符号位和数值位两个部分&#xff0c;符号位为0是正数&#xff0c;1是负数&#xff0c;最高…...

HTML、CSS

什么是HTML、CSS HTML结构标签及特点 CSS引入方式 CSS颜色表示形式&#xff1a; CSS引入方式、颜色表示、颜色属性 CSS选择器 超链接...

c#:主窗体与子控件之间的数据传递:基于事件和委托的实现

1. 概述 在WPF中&#xff0c;主窗体与子控件之间的数据传递通常通过以下两种方式实现&#xff1a; 事件&#xff08;Event&#xff09;&#xff1a;主窗体触发事件&#xff0c;子控件订阅事件并接收数据。 委托&#xff08;Delegate&#xff09;&#xff1a;通过委托将子控件…...

Dynamics 365 启用用户安全角色变更的审核功能

D365自身的审核功能这里就不说了&#xff0c;是一个很古老的功能&#xff0c;用过D365的人应该都知道&#xff0c;今天要说的是用户安全角色变更的审核记录。 很多人用系统的审核功能&#xff0c;更多的是用来追踪用户的登录记录&#xff0c;或者记录的修改记录。 而实际的项目…...

MyBatis注解

MyBatis 的注解&#xff08;Annotations&#xff09;提供了一种简洁的方式来配置 SQL 映射&#xff0c;而无需使用 XML 文件。通过在 Mapper 接口的方法上使用注解&#xff0c;可以直接在 Java 代码中定义 SQL 语句和相关映射。这种方式使得代码更加集中和易于维护&#xff0c;…...

1.Windows+vscode+cline+MCP配置

文章目录 1.简介与资源2.在windows中安装vscode及Cline插件1. 安装vscode2. 安装Cline插件3. 配置大语言模型3. 配置MCP步骤(windows) 1.简介与资源 MCP官方开源仓库 MCP合集网站 参考视频 2.在windows中安装vscode及Cline插件 1. 安装vscode 2. 安装Cline插件 Cline插件…...

94.HarmonyOS NEXT动画系统实现教程:深入理解FuncUtils

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; HarmonyOS NEXT动画系统实现教程&#xff1a;深入理解FuncUtils 文章目录 HarmonyOS NEXT动画系统实现教程&#xff1a;深入理解FuncUtils1. 动画系…...

Python----数据分析(Pandas一:pandas库介绍,pandas操作文件读取和保存)

一、Pandas库 1.1、概念 Pandas是一个开源的、用于数据处理和分析的Python库&#xff0c;特别适合处理表格类数 据。它建立在NumPy数组之上&#xff0c;提供了高效的数据结构和数据分析工具&#xff0c;使得数据操作变得更加简单、便捷和高效。 Pandas 的目标是成为 Python 数据…...

设计模式之原型模式:原理、实现与应用

引言 原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;它通过复制现有对象来创建新对象&#xff0c;而不是通过实例化类。原型模式特别适用于创建成本较高的对象&#xff0c;或者需要动态配置的对象。本文将深入探讨原型模式的原理、实现方…...

平方矩阵问题

Ⅰ 回字形二维数组 #include <iostream> #include <iomanip> using namespace std; int main(){int n;while(cin>>n,n){for(int i0; i<n;i){for(int j0; j<n; j){int upi, downn-i1, leftj, rightn-j1;cout<<min(min(up,down),min(left,right)…...

C语言之链表

文章目录 前言 一、链表基本概念 1、声明节点结构 2、创建节点变量 3、链表所有节点 4、遍历链表 二、add添加 三、insert插入 四、remove删除 五、查找 总结 前言 链表是一种重要的数据结构&#xff0c;用于存储和组织数据。它是由一系列节点组成的数据结构&#x…...

RabbitMQ延迟消息

文章目录 延迟消息死信交换机延迟消息延迟消息应用场景 延迟消息 生产者在发送消息的时候指定一个时间&#xff0c;消费者不会立即收到该消息&#xff0c;而是在指定时间之后才收到消息&#xff0c;这就是延迟消息。 比如说这么一个场景&#xff0c;用户下单后将商品库存进行…...

Unity中WolrdSpace下的UI展示在上层

一、问题描述 Unity 中 Canvas使用World Space布局的UI&#xff0c;想让它不被3d物体遮挡&#xff0c;始终显示在上层。 二、解决方案 使用shader解决 在 UI 的材质中禁用深度测试&#xff08;ZTest&#xff09;&#xff0c;强制 UI 始终渲染在最上层。 Shader "Custo…...

【从零开始学习计算机科学】算法分析(一)算法、渐进分析、递归分析

【从零开始学习计算机科学】算法分析(一)算法、渐进分析、递归分析 算法算法分析正确性算法完成需要的时间使用的存储空间简单性渐进分析递归分析主方法求解递归式递归树求解代入法概率分析和随机算法顺序统计量算法 什么是算法?算法(Algorithm)是指解题方案的准确而完整…...

【菜鸟飞】Conda安装部署与vscode的结合使用

介绍 Conda 是一个跨平台的开源工具&#xff0c;用于管理软件包和环境。最初由 Anaconda 公司开发&#xff0c;它的设计目标是支持数据科学和机器学习领域&#xff0c;但其功能不仅局限于此。 以下是 Conda 的核心特点&#xff1a; 包管理&#xff1a;安装、更新、卸载各种库…...

LeetCode2593 标记所有元素后数组的分数

贪心算法实战&#xff1a;数组标记与分数计算&#xff08;LeetCode 同类题解析&#xff09; 一、问题描述 给定一个正整数数组 nums&#xff0c;按以下规则计算最终分数&#xff1a; 初始分数 score 0每次选择最小且未被标记的元素&#xff08;值相同选下标最小&#xff09…...

【C++多线程】thread

C中的std::thread是C11引入的线程库的一部分&#xff0c;提供了创建和管理线程的能力。它封装了操作系统的线程接口&#xff0c;使得在C中更方便地进行多线程编程。 1. std::thread 的定义 std::thread 类位于<thread>头文件中&#xff0c;定义在std命名空间下&#xff…...

补充二分LIS

B3637 最长上升子序列 题目描述 这是一个简单的动规板子题。 给出一个由 n ( n ≤ 5000 ) n(n\le 5000) n(n≤5000) 个不超过 1 0 6 10^6 106 的正整数组成的序列。请输出这个序列的最长上升子序列的长度。 最长上升子序列是指&#xff0c;从原序列中按顺序取出一些数字排…...

airtest用法

安装python3.7.9 64 python3 -m pip install -U airtest 或者&#xff1a; git clone https://github.com/AirtestProject/Airtest.git pip install -e airtest 下载adb 可以开始无界面的airtest 下载AirtestIDE 安装与启动 - Airtest Project Docs Airtest Project...

30天学习Java第四天——设计模式

设计模式概述 设计模式是一套被广泛接受的、经过试验的、可反复使用的基于面向对象的软件设计经验总结&#xff0c;它是开发人员在软件设计时&#xff0c;对常见问题的解决方案的总结和抽象。 一句话就是&#xff0c;设计模式是针对软件开发中常见问题和模式的通用解决方案。 …...

MongoDB 和 Elasticsearch的区别、优缺点对比,以及选型建议

MongoDB 和 Elasticsearch 在存储和搜索方面各有特点&#xff0c;适用于不同的场景。以下是它们的区别、优缺点对比&#xff0c;以及选型建议。 1. 概述 MongoDB&#xff1a;分布式 NoSQL 文档数据库&#xff0c;基于 BSON&#xff08;类似 JSON&#xff09;的文档存储&#x…...

在Android中,子线程可以更新UI吗

目录 为什么子线程不能直接更新UI&#xff1f; 如何正确在子线程更新UI&#xff1f; 1. 使用runOnUiThread方法 2. 通过Handler发送消息到主线程 3. 使用View.post(Runnable)方法 4. 结合AsyncTask&#xff08;已过时&#xff0c;仅作了解&#xff09; 5. 使用Kotlin协程…...

unittest vs pytest区别

unittest vs pytest 对比 ​unittest 像“手动挡汽车”&#xff1a;操作步骤多&#xff0c;规则严格&#xff0c;适合老司机。​pytest 像“自动挡汽车”&#xff1a;开起来轻松&#xff0c;功能强大&#xff0c;适合新手和高效开发。 区别点​unittest​&#xff08;你学过的&…...

OpenAI与谷歌DeepMind新品同日竞技,谁能引领机器人现实任务新潮流?

2025年3月12日&#xff0c;科技巨头谷歌DeepMind与OpenAI均发布了与机器人执行现实任务相关的新产品&#xff1a;谷歌DeepMind的新AI模型、OpenAI的Agents工具集&#xff0c;二者在技术路径、应用场景、安全机制设计等方面存在明显差异&#xff0c;其发展态势备受行业关注。 …...

JVM并发编程AQSsync锁ReentrantLock线程池ThreadLocal

并发编程2 synchronized锁实现**AQS****ReentrantLock实现****JUC 常用类**池的概念 ThreadLocalThreadLocal原理内存泄露强引用:软引用弱引用虚引用ThreadLocal内存泄露 synchronized锁实现 synchronized是一个关键字,实现同步,还需要我们提供一个同步锁对象,记录锁状态,记录…...

特殊 IP 地址

文章目录 特殊IP地址概述受限广播地址&#xff08;Limited Broadcast Address&#xff09;直接广播地址&#xff08;Directed Broadcast Address&#xff09;多播地址&#xff08;Multicast Address&#xff09;环回地址&#xff08;Loopback Address&#xff09;本网络本主机&…...

SSL/TLS 1.2过程:Client端如何验证服务端证书?

快速回顾非对称加密和对称加密 首先快速说一下非对称加密和对称加密。非对称加密&#xff0c;就是有一个公钥和私钥(成对存在)。 公钥对一段文本A加密得到文本B&#xff0c;只有对应的私钥能对B解密得到A。 私钥对一段文本C加密得到文本D&#xff0c;只有对应的公钥能对D解密得…...

Android(java)高版本 DownloadManager 封装工具类,支持 APK 断点续传与自动安装

主要有以下优点 兼容高版本 Android&#xff1a;适配 Android 10 及以上版本的存储权限和安装权限。断点续传&#xff1a;支持从断点继续下载。下载进度监听&#xff1a;实时获取下载进度并回调。错误处理&#xff1a;处理下载失败、网络异常等情况。自动安装 APK&#xff1a;…...

基于three.js的虚拟人阴影渲染优化方案

作者&#xff1a;来自 vivo 互联网大前端团队- Su Ning 本文将探讨 three.js 中的阴影渲染机制&#xff0c;并分享一些针对性能和效果优化的实用技巧&#xff0c;帮助开发者在不同场景下做出最佳的权衡选择。 一、前言 在3D网页应用中&#xff0c;高质量的阴影渲染对于营造场…...

人工智能中神经网络是如何进行预测的

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 https://www.captainbed.cn/north 文章目录 引言神经网络的基本结构神经网络的前向传播前向传播的步骤激活函数 代码实现流程图详细解释…...

vue3 中使用 Recorder 实现录音并上传,并用Go语言调取讯飞识别录音(Go语言)

录音并识别 效果图一、开启游览器录音权限二、前端代码三、Go代码,上传到讯飞识别录音返回到前端 效果图 recorder-core插件可以在网页中进行录音。录音文件(blob)并可以自定义上传&#xff0c;可以下载录音文件到本地,本文录音过程中会显示可视化波形&#xff0c;插件兼容PC端…...

自探索大语言模型微调(一)

一、数据 1.1、失败案例 Hugging Face&#xff1a; 根据B站上搜索到的资料&#xff0c;datasets这个库可以直接下载丰富的数据集合和与训练模型&#xff0c;调用也非常的简单&#xff0c;唯一的缺点就是&#xff0c;需要外网&#xff08;翻墙&#xff09;&#xff0c;用国内的…...

算法练习(链表)

链表 链表的分类 单向链表&#xff0c;双向链表带头链表&#xff0c;不带头链表循环的&#xff0c;非循环的 链表的结构 图中所示的为链表的一个节点&#xff0c;value是这个节点的所存储的数据值&#xff0c;next为下一节点的地址。 代码实现链表 1.创建节点类 节点由…...

在 Ubuntu 服务器上使用宝塔面板搭建博客

&#x1f4cc; 介绍 在本教程中&#xff0c;我们将介绍如何在 Ubuntu 服务器 上安装 宝塔面板&#xff0c;并使用 Nginx PHP MySQL 搭建一个博客&#xff08;如 WordPress&#xff09;。 主要步骤包括&#xff1a; 安装宝塔面板配置 Nginx PHP MySQL绑定域名与 SSL 证书…...

K8S学习之基础二十八:k8s中的configMap

k8s中的configMap ​ configMap是k8s的资源对象&#xff0c;简称cm&#xff0c;用于保存非机密性的配置&#xff0c;数据可以用key/value键值对形式保存&#xff0c;也可以通过文件形式保存 ​ 在部署服务的时候&#xff0c;每个服务都有自己的配置文件&#xff0c;如果一台服…...

EDID读取学习

简介 Video BIOS可以被认为是一个具有独立硬件抽象层的操作系统。它不会阻止或监视操作系统、应用程序或设备驱动程序对硬件的直接访问。虽然不推荐,但一些DOS应用程序确实可以改变基本的硬件设置,而根本不需要通过视频BIOS。大多数现代应用程序和操作系统都避免直接使用硬件…...

基于 SSE 和 WebSocket 的在线文本实时传输工具

简介 在线文本实时传输工具支持 SSE&#xff08;Server-Sent Events&#xff09; 和 WebSocket&#xff0c;可在不同设备间快速共享和同步文本&#xff0c;适用于跨设备协作、远程办公和即时通讯。 核心功能 实时同步&#xff1a;文本输入后&#xff0c;另一端用户可立即看到…...

​​​​​​​大语言模型安全风险分析及相关解决方案

大语言模型的安全风险可以从多个维度进行分类。 从输入输出的角度来看,存在提示注入、不安全输出处理、恶意内容生成和幻觉错误等风险; 从数据层面来看,训练数据中毒、敏感信息泄露和模型反演攻击是主要威胁; 模型自身则面临拒绝服务和盗窃的风险; 供应链和插件的不安全引…...

4、linux c 进程

【三】进程 1. 进程与程序的区别 程序&#xff1a;存放在磁盘上的指令和数据的有序集合&#xff08;文件&#xff09;&#xff0c;是静态的。 进程&#xff1a;执行一个程序所分配的资源的总称&#xff0c;是动态的。 2. 进程的组成部分 BSS段&#xff08;bss&#xff09;&…...

OpenFeign

OpenFeign 工作原理详解 1. 声明式接口 开发者通过定义一个接口&#xff0c;并使用特定的注解&#xff08;如GetMapping, PostMapping等&#xff09;来描述HTTP请求。OpenFeign会根据这些注解自动生成相应的HTTP请求。 注解支持&#xff1a; FeignClient&#xff1a;用于定…...

Centos离线安装perl

文章目录 Centos离线安装perl1. perl是什么&#xff1f;2. Perl下载地址3. perl的安装4. 安装结果验证 Centos离线安装perl 1. perl是什么&#xff1f; Perl 是一种 高级脚本语言&#xff0c;诞生于 1987 年&#xff0c;以强大的 文本处理能力 和灵活性著称&#xff0c;常用于…...

RabbitMQ可靠性进制

文章目录 1.生产者可靠性生产者重连生产者确认小结 2. MQ的可靠性数据持久化LazyQueue小结 3. 消费者的可靠性消费者确认机制消费者失败处理方案业务幂等性唯一消息ID业务判断 兜底方案业务判断 兜底方案 1.生产者可靠性 生产者重连 在某些场景下由于网络波动&#xff0c;可能…...

PHP优化技术

最近在学习php语言&#xff0c;打算用来提升开发小项目的效率。下面是php项目中常见的优化手段。 1、引起php性能问题的原因 &#xff08;1&#xff09;php语法使用不当 &#xff08;2&#xff09;使用php做了它不擅长的事 &#xff08;3&#xff09;用php连接的服务不给力 &…...

【Go类库分享】Go expr 通用表达式引擎

【Go类库分享】Go expr 通用表达式引擎 官方教程&#xff1a;https://expr-lang.org/docs/language-definition 官方Github&#xff1a;https://github.com/expr-lang/expr 文章所含代码地址&#xff1a;https://github.com/ziyifast/ziyifast-code_instruction/tree/main/go-d…...

线性代数(1)用 excel 计算鸡兔同笼

线性代数excel计算鸡兔同笼 案例&#xff1a;鸡兔同笼问题的三种解法&#xff08;递进式教学&#xff09;一、问题描述二、方程式解法&#xff08;基础版&#xff09;步骤解析 三、线性代数解法&#xff08;进阶版&#xff09;1. 方程组转化为矩阵形式2. 矩阵求解&#xff08;逆…...

Docker基础知识介绍

Docker基础篇 必须要在Linux环境下才能运行&#xff0c;windows下运行也是安装虚拟机后才能下载安装运行 下载安装 linux 依次执行下边步骤 更新 yum yum update 卸载旧的Docker yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \do…...

机器人交社保属于“无稽之谈”?

今晨浏览社交网站&#xff0c;惊奇地看到“给机器人上社保”的网页搜索结果竟然多达“约 3,280,000个”。所以被称为“无稽之谈”和“本质上是利用社保之名收税”就实不为过&#xff0c;而且还会让人读罢笑得喷饭&#xff1a;“连搞笑大王赵本山见了&#xff0c;也定会拱手作揖…...

接口测试和功能测试的区别

接口测试和功能测试的区别 一 **接口测试概述**1.1 定义1.2 优缺点 二 **功能测试概述**2.1 定义2.2 优缺点 三 **主要区别**四 两者在测试点的区别4.1 **接口测试的测试点**4.2 **功能测试的测试点**4.3 **接口测试 vs. 功能测试的测试点对比** 五 区别类比**例子背景**&#…...