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

7月24日JavaSE学习笔记

序列化版本控制

序列化:将内存对象转换成序列(流)的过程

反序列化:将对象序列读入程序,转换成对象的方式;反序列化的对象是一个新的对象

serialVersionUID 是一个类的序列化版本号

    private static final long serialVersionUID=1L;//版本号

如果序列化版本号没有定义,JDK会自动给予一个版本号,当该类发生变化时,序列化版本号会发生变化,反序列化就会失败;

java.io.InvalidClassException: com.easy724.Student; local class incompatible: stream classdesc serialVersionUID = -8506049007973969582, local class serialVersionUID = -401684047259788573

自定义版本号,只要该版本号不发生变化,即使该类中的属性或方法发生改变,该类的对象依旧可以反序列化。

注意:想要序列化,必须该类中的所有对象都是可序列化的(实现Serializable接口)


transient 关键字:暂存,禁止属性的值被序列化

    //transient 暂存,禁止属性的值被序列化private transient String sex;


flush方法

flush方法用于将输出流中的缓冲区内容立即写入目标设备,使得数据能够及时发送出去。

在Java中,几乎所有的输出流都具有flush方法。调用flush方法会强制将缓冲区中的数据写入目标设备,而不需要等到缓冲区被填满或者关闭流时才进行写入操作。

在使用输出流写入数据时,如果没有调用flush方法,写入的数据会先被缓存到缓冲区中,待到缓冲区填满或者手动调用flush方法时才会写入目标设备。但是,在某些情况下,我们需要立即将数据发送出去,例如需要实时更新数据时,可以调用flush方法来实现。

所有的输出流在结束之前都要执行一遍flush()方法


BIO、NIO、AIO

BIO、NIO、AIO 是 Java 编程语言中用于处理网络通信的三种不同的 I/O 模型。

BIO(Blocking I/O)是传统的同步阻塞式 I/O 模型。在这种模型中,每个连接都要创建一个线程进行处理,当有大量连接时,会导致线程数过多,资源消耗增加。

NIO(Non-blocking I/O)是一种基于事件驱动的同步非阻塞 I/O 模型。在这种模型中,I/O 操作不会阻塞线程,而是将 I/O 事件通知给选择器(Selector),然后通过一个或多个线程来处理这些事件。

AIO(Asynchronous I/O)是一种异步非阻塞 I/O 模型。它将数据的读写操作交给操作系统内核来处理,不需要通过线程池或者线程来阻塞等待结果,而是在操作完成后通过回调函数的方式来将数据返回给应用程序。

在高并发的场景下,NIO 和 AIO 的性能会比 BIO 更好。

同步与异步的区别在于:
同步:请求与响应同时进行,直到响应再返回结果;
异步:请求直接返回空结果,不会立即响应,但一定会有响应,通过通知、状态、回调函数响应

阻塞与非阻塞的区别在于:
阻塞:请求后一直等待
非阻塞:请求后,可以继续干其他事,直到响应


线程 Thread类

线程是指计算机中能够执行独立任务的最小单位。它是进程的一部分,一个进程可以包含多个线程。每个线程都是独立运行的,它们共享进程的资源,如内存空间和文件句柄等。线程之间可以通过共享内存进行通信,因此线程之间的切换开销较小。

进程是计算机中执行任务的基本单位,它是程序在执行过程中的一个实例。一个进程可以包含多个线程,每个线程执行不同的任务。进程之间是独立的,它们有自己独立的地址空间和资源。进程之间的通信需要经过额外的机制,如管道、消息队列等。

总结来说,线程是进程的一部分,是计算机中执行任务的最小单位。进程负责管理和分配资源,线程负责具体的任务执行。线程之间共享进程的资源,进程之间需要通过额外的机制进行通信。

常用方法

自定义线程 继承Thread,重写run方法,定义线程要执行的任务

子类抛出的异常只能比父类更精确,父类没有异常,子类的run不能抛出,要处理

1. 获取当前线程对象Thread.currentThread()

class ThreadA extends Thread{//重写run方法,定义线程要执行的任务@Overridepublic void run(){for (int i=0;i<=20;i++){System.out.println(i+Thread.currentThread().getName());}}
}

2. 开启线程 start()

        //实例化线程对象ThreadA a = new ThreadA();ThreadA b = new ThreadA();//开启线程,多线程可能交叉执行a.start();b.start();//普通对象调用方法,通过main主线程依次执行
//        a.run();
//        b.run();

3. 休眠的方法 sleep()

sleep 是一个Thread类的静态方法,传入一个long类型的参数表示当线程运行到这里时要休眠多少毫秒,休眠结束后会自动启动线程。

    //休眠的方法 sleeppublic static void threadSleep() throws InterruptedException {System.out.println("1---------");//让运行到该行代码的线程休眠5秒Thread.sleep(5000);System.out.println("2---------");}

4. 设置优先级 setPriority()

优先级最小为1,最大为10,默认5;

优先级越高,获取CUP资源(时间片)的几率越大

并不是谁的优先级高就执行谁,也会出现交叉

    public static void priority(){Thread a=new ThreadB();Thread b=new ThreadB();//设置优先级:最大10,最小1,默认5    设置其他值报非法参数异常a.setPriority(4);b.setPriority(6);//优先级越高,获取CUP资源的几率越大(时间片)a.start();b.start();}

5. 礼让 yield

作用:让出CPU资源,让CPU重新分配;

防止一条线程长时间占用资源,达到CPU合理分配的效果;

sleep(0)也可以达到重新分配CPU资源的效果

    @Overridepublic void run(){for(int i=0;i<20;i++){if(i%3==0){System.out.println(this.getName()+"---执行了礼让");Thread.yield();}System.out.println(i+this.getName());}}

6. 加入(插队)join()

在A线程中执行了B.join(),B线程运行完毕,A线程再运行

    @Overridepublic void run(){for(int i=0;i<200;i++){if(i==10&&t!=null&&t.isAlive()){System.out.println(this.getName()+"----执行了JION");try {t.join();} catch (InterruptedException e) {throw new RuntimeException(e);}}System.out.println(i+this.getName());}}

关闭线程:

1.执行stop方法 不推荐

2.调用interrupt()设置中断状态,这个线程不会直接中断, 我们需要在线程内部通过isInterrupted判断中断状态是否被设置,然后执行中断操作

    @Overridepublic void run(){for(int i=0;i<100;i++){if(Thread.currentThread().isInterrupted()){//判断中断状态break;}try {Thread.sleep(500);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(i);}}

3.自定义一个状态属性,在线程外部设置此属性,影响线程内部的运行

class ThreadG extends Thread{volatile boolean stop=false;//不稳定的,声明这个属性的值可能发生变化@Overridepublic void run(){while (!stop){//System.out.println("A");}}
}

这里需要用到volatile关键字:不稳定的,易变的,声明这个属性的值可能发生变化

volatile关键字用于修饰变量,表示该变量是易变的(volatile变量)。当一个变量被声明为volatile时,它会告知编译器和虚拟机该变量可能会被多个线程同时访问并修改,因此需要特别注意线程可见性和指令重排序等问题。

对于使用了volatile修饰的变量,在线程外部对其进行修改后,其他线程在访问该变量时能够立即看到最新的值,而不会使用缓存中的旧值。

使用volatile关键字的一个常见应用场景是用于控制线程的停止标志。例如,我们可以定义一个volatile变量作为线程的停止标志,在外部设置该变量的值为true时,线程内部通过检查该变量的值来决定是否停止执行。

    public static void stopThread(){ThreadG a = new ThreadG();a.start();try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}a.stop = true;System.out.println("设置关闭");}

volatile关键字在多线程编程中起到了两个主要作用:

  1. 可见性:如果一个变量被声明为volatile,当一个线程修改了该变量的值,其他线程可以立即看到变量的最新值。普通的变量在多线程环境下可能存在数据不一致的问题,因为线程A修改了变量的值,但是线程B在此之前已经缓存了该变量的旧值,导致线程B读取的是一个过期的值。使用volatile关键字可以避免这种情况发生,保证变量的可见性。

  2. 有序性:普通的变量在多线程环境下可能存在指令重排序的问题。指令重排序是指处理器为了提高执行效率,可能会对指令进行重新排序执行,但是重排序可能会导致代码的执行顺序与预期不一致。使用volatile关键字可以禁止指令重排序,保证代码的执行顺序与程序员编写的顺序一致

需要使用volatile关键字的主要原因是多线程环境下的可见性和有序性问题。在多线程编程中,为了保证数据的一致性和正确性,需要使用volatile关键字来解决这些问题。


线程的生命周期

线程的生命周期可以简要概括为以下几个状态:

  1. 新建(New):线程被创建但尚未开始执行。
  2. 就绪(Runnable):线程处于可运行状态,等待被分配CPU时间片以执行。此时可能有多个线程处于就绪状态,但只有一个线程能够获得CPU时间片执行。
  3. 运行(Running):线程获得了CPU时间片,正在执行线程体中的代码。
  4. 阻塞(Blocked):线程因为某些原因被阻塞,暂时停止执行。可能的原因包括等待某个操作完成、等待输入/输出、等待锁等。当阻塞条件满足时,线程会重新进入就绪状态。
  5. 等待(Waiting):线程因为调用了wait()方法,主动让出CPU并进入等待状态,直到其他线程调用了相同对象的notify()notifyAll()方法才能被唤醒。
  6. 超时等待(Timed Waiting):线程因为调用了带有超时参数的wait()join()sleep()方法,进入具有超时等待时间的等待状态。当超时时间到达或其他线程唤醒它时,线程会重新进入就绪状态。
  7. 终止(Terminated):线程执行完了所有的代码或者出现了未捕获的异常而意外终止。

线程安全

线程安全是多个线程操作一个对象,不会出现结果错乱的情况(不是指顺序不一致,是结果缺失)

同步(Synchronous)指的是线程按照顺序依次执行,前一个线程执行完毕后,下一个线程才能开始执行同步可以保证线程之间的操作按照一定的顺序和规则进行,从而避免竞争条件和数据不一致的问题。常用的同步机制包括使用锁(如synchronized关键字)、信号量、互斥量等。

异步(Asynchronous)指的是线程在执行任务时,不需要等待上一个任务的完成,而是同时执行多个任务。异步通常通过回调函数、事件驱动等方式实现。异步执行可以提高程序的性能和响应速度,但也需要考虑线程安全问题。

StringBuilder是线程不安全的,StringBuffer是线程安全的

//实现Runnable接口,是实现线程的一种方式,是一个任务,不是线程类
class RunA implements Runnable{StringBuffer strB;public RunA(StringBuffer strB){this.strB = strB;}@Overridepublic void run() {for(int i=0;i<1000;i++){strB.append("0");}}
}

不继承Thread,通过实现Runnable接口也可以使用线程操作运行。

  1. 通过传入Runnable接口实现类的对象,可以将多个线程所需执行的任务抽象为一个统一的接口,避免了重复编写相同的代码。可以让多个线程对同一个对象操作。

  2. 在Java中,一个类只能继承自一个父类,但是可以实现多个接口。通过传入Runnable接口实现类对象,可以将线程任务类继承自其他的类,并且实现Runnable接口,提高灵活性。
        StringBuffer strB = new StringBuffer();RunA r=new RunA(strB);Thread a=new Thread(r);a.start();Thread b=new Thread(r);b.start();try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(strB.length());}

StringBuilder当多个线程同时操作时,可能出现同时操作数组同一个位置的情况,导致数据缺失。

StringBuffer中的方法用synchronized修饰,同一时间内只允许一个线程执行


synchronized 同步

要做到线程安全,我们可以使用synchronized对方法或者代码块加锁,达到线程同步的效果;

使用synchronized关键字修饰的方法或代码,同一时间内,只允许一个线程执行此代码。

synchronized修饰方法:

    public static synchronized void test(){try {System.out.println("----进入方法----"+Thread.currentThread().getName());Thread.sleep(1000);System.out.println("----执行完毕----"+Thread.currentThread().getName());} catch (InterruptedException e) {throw new RuntimeException(e);}}

修饰代码块:

    //同步代码块public static void testA(){System.out.println("进入方法"+Thread.currentThread().getName());synchronized (SyncThreadB.class){System.out.println("进入同步代码块"+Thread.currentThread().getName());try {Thread.sleep(2000);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("结束同步代码块"+Thread.currentThread().getName());}}

锁对象

在Java中,synchronized关键字用于实现线程同步,保证共享资源的安全访问。当一个线程请求进入synchronized代码块时,它必须先获得锁对象(也称为监视器对象、互斥锁),只有获得锁对象的线程才能进入临界区(synchronized代码块)执行代码。其他线程在未获取到锁对象时会进入等待状态,直到锁对象被释放。

锁对象可以是任意Java对象,可以是共享资源本身,也可以是一个专门用于控制同步访问的对象。当某个线程获得锁对象后,其他线程就无法同时进入相同的synchronized代码块,只能等待锁对象被释放。这样就保证了同一时间只有一个线程能够访问共享资源,从而避免了多线程并发访问带来的数据不一致或竞争条件的问题。

使用synchronized需要指定锁对象:

synchronized修饰成员方法时,锁对象就是 this(当前对象)

修饰静态方法时,锁对象是 类的类对象 如 obj.getClass() 或者 类名.class

类对象:用来描述一个类中定义的内容的对象。


锁的分类

以下是几种常见的锁分类:

  1. 悲观锁和乐观锁:悲观锁认为在并发情况下会发生冲突,所以默认加锁来保护共享资源。乐观锁则认为并发冲突的概率较低,采用无锁或轻量级锁的方式来实现并发控制。悲观锁有锁对象,乐观锁没有锁对象。

  2. 公平锁和非公平锁:公平锁按照线程请求锁的顺序进行获取,保证了先来后到的公平性。非公平锁则允许线程插队,不保证获取锁的顺序,提高了吞吐量。

  3. 可重入锁和不可重入锁:可重入锁允许同一个线程多次获取同一个锁对象的锁。当线程已经持有锁时,再次获取锁时不会被阻塞,而是增加锁的计数。不可重入锁则不允许同一个线程多次获取同一个锁。(可重入锁在同步代码块中遇到相同的锁对象的同步代码块,不需要再获取锁对象的权限,直接进入执行;Java里面全部都是可重入锁)

  4. 偏向锁,轻量级锁(自旋锁)和重量级锁:偏向锁适用于只有一个线程访问同步代码块的情况;轻量级锁适用于多个线程竞争同步代码块的情况,但竞争不激烈的场景;而重量级锁适用于竞争激烈的场景,多个线程频繁竞争同步代码块的情况。

偏向锁是一种针对线程访问同步代码块的优化手段。当一个线程获取了一个同步代码块的锁之后,如果没有其他线程竞争该锁,则持有锁的线程会偏向于该锁,在以后的访问中无需再经过同步操作,提高了性能。

轻量级锁(自旋锁)是一种针对多个线程竞争同步代码块的优化手段。当一个线程尝试获取一个同步代码块的锁时,如果当前锁处于偏向状态且偏向线程是当前线程,则可以直接获取锁而无需进入阻塞状态。如果当前锁不处于偏向状态,或者处于偏向状态但是偏向线程不是当前线程,则需要使用自旋等待锁的释放,而不阻塞线程。

重量级锁是一种针对多个线程竞争同步代码块的一种常规锁机制。当多个线程尝试获取同一个锁时,除了自旋等待锁的释放外,还会将未获取到锁的线程阻塞起来,直到锁的持有者释放锁,被阻塞的线程才能继续执行。


synchronized是什么锁?

synchronized关键字可以被看作是一种悲观锁,使用锁对象来实现线程同步。它确保在同一时间只有一个线程可以获取到锁对象,并进入synchronized代码块执行。其他线程需要等待锁对象被释放后才能进入。

synchronized关键字默认是非公平锁,也就是说,不会按照线程的启动顺序来获取锁,而是随机的。当多个线程同时竞争锁时,并不保证先尝试获取锁的线程一定会获得锁。

synchronized关键字是可重入锁,同一个线程可以重复获取锁对象。在同步代码块中,遇到相同的锁对象的同步代码块,不需要再次获取锁对象的权限,而是直接进入执行。

关于synchronized的锁类型,涉及到锁的状态。当没有竞争时,synchronized使用偏向锁来优化,如果有竞争,升级为轻量级锁(自旋锁),如果自旋不成功,则进一步升级为重量级锁。

综上所述,synchronized关键字可以被看作是一种悲观锁,使用锁对象实现线程同步。它是非公平锁,支持可重入性,并且在不同的竞争情况下可能升级为不同的锁类型。


乐观锁的实现方式?

乐观锁是一种并发控制机制,用于解决多线程同时访问共享资源可能导致的数据不一致问题。乐观锁的实现方式有两种常见的方式:CAS(Compare and Swap)和版本号控制

CAS(比较并交换)是一种无锁并发控制方式,它通过比较共享资源的当前值与期望值是否相等来判断其他线程是否修改了该值。如果相等,则将共享资源的值更新为新值,如果不相等,则表示有其他线程已经修改了该值,此时需要重新读取共享资源的值并重试。CAS操作是原子的,因此可以确保并发安全。

版本号控制是通过为共享资源增加一个版本号来实现的。每次修改共享资源时,都会更新版本号。当一个线程要修改共享资源时,首先读取共享资源的版本号,并保存为当前版本号。如果其他线程在此期间已经修改了共享资源,则当前版本号与保存的版本号不相等,此时需要放弃修改操作。通过版本号的比较,可以确保只有最新的修改才能成功。

两种方式各有优缺点。CAS方式由于没有锁的开销,在低并发情况下性能较好,但在高并发情况下会导致大量的重试,降低效率。版本号控制方式则可以避免重试,但需要维护额外的版本号字段,增加了存储和计算开销。

综上所述,选择使用哪种乐观锁实现方式,需要根据具体的应用场景和性能需求来决定。

相关文章:

7月24日JavaSE学习笔记

序列化版本控制 序列化&#xff1a;将内存对象转换成序列&#xff08;流&#xff09;的过程 反序列化&#xff1a;将对象序列读入程序&#xff0c;转换成对象的方式&#xff1b;反序列化的对象是一个新的对象。 serialVersionUID 是一个类的序列化版本号 private static fin…...

微信小程序教程008:事件绑定

文章目录 事件绑定1、什么是事件2、小程序中常用事件3、事件对象的属性列表4、target和currentTarget的区别5、bindtap的语法格式6、在事件处理函数中为data中的数据赋值7、事件传参数8、bind:input语法格式9、实现文本框和data之间的数据同步事件绑定 1、什么是事件 事件是渲…...

企业级-实现Nginx的静态文件服务器映射

作者&#xff1a;fyupeng 技术专栏&#xff1a;☞ https://github.com/fyupeng 项目地址&#xff1a;☞ https://github.com/fyupeng/distributed-blog-system-api 留给读者 开发人员往往会经常需要通过浏览器下载文件、图片或者PDF或者缩略图等&#xff0c;这时候我们可以根据…...

CTF Web SQL注入 10000字详解

这里写目录标题 涉及的数据库知识unionorder bydatabase()information_schemalimit--空格注释replaceinto outfilelikeGROUP BYHAVINGGROUP BY、HAVING、WHERE之间的关系regexp 原理信息收集操作系统数据库判断注入点注入点类型POST注入数字型注入字符型注入搜索型注入Insert/u…...

动态SLAM:如何判断一个特征是动态特征(对极几何)

文章目录 1.什么是极线、极点和极面2.如何判断其为动态点特征3.如何判断其为动态线特征 1.什么是极线、极点和极面 由图可知&#xff0c;C1,C2,X(X1,X2)组成了一个三角平面&#xff0c;这个三角所在的平面就是极面 在这个极平面中&#xff0c;和成像平面相交的线是极线&#xf…...

【C++】初识C++基础篇·一(命名空间,函数重载,缺省参数,引用);

文章目录 前言1.输入与输出输出输入cin和scanf的对比 2.命名空间2.1namespace存在的意义2.2namespace的使用3.缺省参数4.函数重载重载函数的调用规则 5.引用 前言 我们先通过一段简单的代码来拉开C的序幕&#xff1b; //text.cpp #include<iostream> #include<stdio…...

2024年道路运输安全员考试题库及答案

一、判断题 1.国家制订《中华人民共和国道路交通安全法》的目的是为了维护道路交通秩序&#xff0c;预防和减少交通事故&#xff0c;保护人身安全&#xff0c;保护公民、法人和其他组织的财产安全及其他合法权益&#xff0c;提高通行效率。 答案&#xff1a;正确 2.依据《中…...

Linux Vim教程(十二):语法高亮与代码折叠

目录 1. 语法高亮 1.1 启用语法高亮 1.2 设置配色方案 1.3 自定义语法高亮 2. 代码折叠 2.1 启用代码折叠 2.2 设置折叠方法 2.3 手动折叠 2.4 基于缩进的折叠 2.5 基于语法的折叠 3. 案例 3.1 配置文件 3.2 编辑Python文件 3.3 使用折叠功能 4. 高级使用技巧 …...

JavaScript(18)——事件类型,事件对象

事件类型 鼠标事件&#xff1a; click&#xff1a;鼠标点击 mouseenter&#xff1a;鼠标经过 mouseleave&#xff1a;鼠标离开 焦点事件&#xff1a; focus&#xff1a;获得焦点 blur&#xff1a;失去焦点 键盘事件&#xff1a; Keydown&#xff1a;键盘按下触发 Keyup&#…...

有效组织离散变量:指针数组在C语言中的应用

把离散变量组织起来&#xff0c;访问起来更加方便&#xff0c;无需一个个变量单独赋值。 如modbus读写reg&#xff0c; 把a\b\c\d实时变化分散的变量组织成一个数组reg&#xff0c;方便获取 相当于变量的内存地址池 int main() {int a 10, b 20, c 30, d 40;int i;int *re…...

qt 应用正在运行时,如何更新升级exe文件

在Qt应用正在运行时&#xff0c;直接替换同名的.exe文件可能会导致文件正在使用中的错误。为了安全地更新.exe文件&#xff0c;你可以采取以下步骤&#xff1a; 创建一个临时的.exe文件。 等待当前.exe文件的进程关闭。 删除原有的.exe文件。 将临时.exe文件重命名为原有的.…...

git的rebase 和 merge 的区别

rebase 和 merge 的区别 Merge&#xff08;合并&#xff09;和 Rebase&#xff08;变基&#xff09;是 Git 中两种常用的分支整合方式&#xff0c;它们有不同的工作原理和适用场景&#xff1a; Merge&#xff08;合并&#xff09;&#xff1a; ● Merge 操作将两个分支的不同提…...

django基于大数据的电影推荐系统-计算机毕业设计源码71246

目 录 摘 要 1 绪论 1.1 选题背景与意义 1.2研究现状 1.3研究内容 1.4 开发环境 1.5论文结构与章节安排 2 相关理论和技术 2.1 协同过滤算法 2.2 B/S体系结构介绍 2.3 Python爬虫技术 2.4 Django框架介绍 2.5 MySQL数据库 3 电影推荐系统系统分析 3.1 可行性分析…...

reverse_re3-入土为安的第十天

一个迷宫题 shirtf12发现flag字样 点进去发现迷宫 675 应该是3 * 15*15 即有三个迷宫 shifte提取 import numpy as np# 你的数据&#xff08;长度应为 225 的倍数&#xff09; dword_202020 [1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,3,1,1,0,0,0,0,0,0,1,1,1,1,1,0,0,…...

fastapi之一

文章目录 安装运行HTTP 请求方法示例 POSTMAN 检验GETPOSTPUTDELETE HTTP 状态码示例GETPOST 综合示例POSTGETPUTDELETE 总结 安装 pip install fastapi或者 pip install fastapi -i https://mirrors.aliyun.com/pypi/simple上面两种方法均可以&#xff0c;选择一个即可&…...

【C语言报错已解决】Format String Vulnerability

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言 在日常开发中&#xff0c;我们经常会遇到各种各样的bug&#xff0c;其中格式化字符串漏洞报错可能是最让人头疼的一种。这…...

关于一个简单的顺序表代码

1.首先是头文件SeqList.h的代码&#xff1a; #pragma once #include<stdio.h> #include<assert.h> #include<stdlib.h> typedef int SXBint; typedef struct SL {SXBint* a;int size;int capacity; }SLnode; //初始化 void SeqLsitInit(SLnode* ps); //尾插…...

【资料分享】2024第三届钉钉杯大学生大数据挑战赛B题思路解析+双语言代码

2024钉钉杯大学生大数据挑战赛&#xff0c;B题解题思路和双语言代码分享&#xff0c;资料预览&#xff1a;...

Typescript学习笔记(2.0)

ts编译选项 tsc app.ts -w 参数-w&#xff0c;就是对app.ts进行监视&#xff0c;每次该文件改变时就会自动编译 **:任意目录 *&#xff1a;任意文件 接口 接口用来定义一个类结构&#xff0c;用来定义一个类中应该包含哪些属性和方法&#xff0c;同时接口也可以当做类型…...

【IJHE】:微通道反应器中全氢二苄基甲苯脱氢产氢

Highlight 微通道反应器中全氢二苄基甲苯脱氢产氢两种不同反应器的比较&#xff1a;搅拌釜和连续微通道反应器连续微通道反应器是一种很有前途的脱氢技术 摘要: 本文对全氢二苄基甲苯作为液态有机氢载体从搅拌槽反应器转换为连续流微通道反应器进行脱氢进行了初步研究。与搅拌槽…...

Spring踩坑:抽象类作为父类,使用子类@Autowired属性进行填充,属性值为null

Spring踩坑&#xff1a;抽象类作为父类&#xff0c;使用子类Autowired属性进行填充&#xff0c;属性值为null Spring Boot中抽象类和依赖注入的最佳实践引言在抽象类中使用Autowired注解protected vs private修饰符低版本Spring Boot的注意事项 构造器中的依赖注入陷阱为什么不…...

C#网络连接:TCP/IP模式下的网络连接与同步

1&#xff0c;目的 为了测试局域网的消息同步&#xff0c;简单写了下TCP/IP模式的同步&#xff0c;参考这个帖子。 2&#xff0c;核心库部分 using System; using System.Net; using System.Net.Sockets; using System.Text;namespace Coldairarrow.Util.Sockets {/// <s…...

基于树莓派(Raspberry Pi) 的智能电表监测系统设计:集成 Home Assistant、SQLite 和 MQTT 协议

在全球对可持续发展和能源节约的关注日益加深的背景下&#xff0c;智能能源管理系统&#xff08;IEMS&#xff09;应运而生。该系统利用现代科技&#xff08;如物联网、云计算和大数据分析&#xff09;来优化能源使用&#xff0c;提高能效&#xff0c;降低能源成本。本文将详细…...

C语言程序设计(二)

四.找素数 素数&#xff1a;除了1和它本身不再有其他因数的自然数。换句话说&#xff1a;一个大于1的自然数 &#xff0c;如果只能被1和它本身整除&#xff0c;那就是素数&#xff08;质数&#xff09;。 在打印中遇到的问题就是&#xff0c;知道怎么写却总是运行不起来。主要…...

Oracle对数据库行和数据库的监控

前言&#xff1a; Oracle对表的监控分为数据行修改DML的监控、对表的DDL监控 1、对表的DML监控&#xff08;数据的增删改&#xff09; -- 创建测试表 create table tab_test01( id varchar2(100) default sys_guid(), name varchar2(100), insert_date date default sysdate…...

论文阅读:面向自动驾驶场景的多目标点云检测算法

论文地址:面向自动驾驶场景的多目标点云检测算法 概要 点云在自动驾驶系统中的三维目标检测是关键技术之一。目前主流的基于体素的无锚框检测算法通常采用复杂的二阶段修正模块,虽然在算法性能上有所提升,但往往伴随着较大的延迟。单阶段无锚框点云检测算法简化了检测流程,…...

Vite + Vue3 + TS项目配置前置路由守卫

在现代前端开发中&#xff0c;使用 Vue 3 和 TypeScript 的组合是一种流行且高效的开发方式。Vite 是一个极速的构建工具&#xff0c;可以显著提升开发体验。本文博主将指导你如何在 Vite Vue 3 TypeScript 项目中配置前置路由守卫&#xff08;Navigation Guards&#xff09;…...

设计模式-备忘录

备忘录&#xff08;Memento&#xff09;设计模式是为了保存对象当前状态&#xff0c;并在需要的时候恢复到之前保存的状态。以下是一个简单的C#备忘录模式的实现&#xff1a; // Originator 类&#xff0c;负责创建和恢复备忘录 class Originator {private string state;publi…...

openEuler安装docker,加速镜像拉取

文章目录 文章来源1.配置镜像源2.编辑配置文件3.安装想要的版本4. ~ 原神&#xff01;5.由于很多镜像无法拉取配置镜像源 文章来源 http://t.csdnimg.cn/zYDYy 原文连接 由于之前的仓库不让用且 1.配置镜像源 由于 国外的镜像仓库好多不让用 所以配置阿里的镜像源 yum-confi…...

angular入门基础教程(七)系统路由

路由的实现 当我们系统越来复杂&#xff0c;功能越来越多&#xff0c;路由也就是必须的了。在 ng 中如何实现路由呢&#xff1f; 启用路由 在 app 目录下&#xff0c;新建一个 router 目录&#xff0c;把 app.routers.ts 文件拷贝过来&#xff0c;并修改一下。 import { Ro…...

Unity Canvas动画:UI元素的动态展示

在Unity中&#xff0c;Canvas是用于管理和展示用户界面&#xff08;UI&#xff09;元素的系统。Canvas动画是UI设计中的重要组成部分&#xff0c;它能够提升用户体验&#xff0c;使界面更加生动和响应用户操作。本文将探讨Unity Canvas动画的基本概念、实现方法以及一些实用的技…...

apache.commons.pool2 使用指南

apache.commons.pool2 使用指南 为什么要使用池 创建对象耗时较长&#xff0c;多线程频繁调用等因素限制了我们不能每次使用时都重新创建对象&#xff0c;使用池化思想将对象放进池内&#xff0c;不同线程使用同一个池来获取对象&#xff0c;极大的减少每次业务的调用时间。 …...

【Python面试题收录】Python编程基础练习题②(数据类型+文件操作+时间操作)

本文所有代码打包在Gitee仓库中https://gitee.com/wx114/Python-Interview-Questions 一、数据类型 第一题 编写一个函数&#xff0c;实现&#xff1a;先去除左右空白符&#xff0c;自动检测输入的数据类型&#xff0c;如果是整数就转换成二进制形式并返回出结果&#xff1b…...

typescript 定义类型

type infoType string; let name: infoType "全易"; let location: infoType "北京"; // let age: infoType 18; // 报错 infoType string&#xff5c;number 就不报错了 let job: infoType "开发"; let love: infoType "吃喝玩乐&q…...

基于Java+SpringBoot+Vue的的课程作业管理系统

前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 哈喽兄弟们&#xff0c;好久不见哦&#xff5…...

分布式日志分析系统--ELK

文章目录 ELK概述ELK主要特点ELK应用架构 Elasticsearch原理JSON格式倒排索引 ES与关系型数据库ES相关概念ES安装说明1.环境初始化2.优化系统资源限制配置3.编辑ES服务文件elasticsearch. yml 优化ELK集群安装脚本scp的使用集群安装成功 Shell命令API使用创建索引创建Type创建分…...

Linux初学基本命令

linux文件目录 1、bin->usr/bin binary存放命令 所有账户可以使用 Linux可以执行的文件&#xff0c;我们称之为命令command 2、boot 存放系统启动文件 3、dev device存放设备文件 4、etc 存放配置文件的目录 configration files 5、home home家目录 存…...

如何优化PyTorch以加快模型训练速度?

PyTorch是当今生产环境中最流行的深度学习框架之一。随着模型变得日益复杂、数据集日益庞大&#xff0c;优化模型训练性能对于缩短训练时间和提高生产力变得至关重要。 本文将分享几个最新的性能调优技巧&#xff0c;以加速跨领域的机器学习模型的训练。这些技巧对任何想要使用…...

用最简单的方法对大数据进行处理 vs spark(不需要安装大数据处理工具)

一、大文件处理策略 &#xff08;一&#xff09;、难点 内存管理&#xff1a; 大文件无法一次性加载到内存中&#xff0c;因为这可能会导致内存溢出&#xff08;OutOfMemoryError&#xff09;。 因此&#xff0c;需要使用流&#xff08;Stream&#xff09;或缓冲区&#xff08…...

非线性校正算法在红外测温中的应用

非线性校正算法在红外测温中用于修正传感器输出与实际温度之间的非线性关系。红外传感器的输出信号&#xff08;通常是电压或电流&#xff09;与温度的关系理论上是线性的&#xff0c;但在实际应用中&#xff0c;由于传感器特性的限制&#xff0c;这种关系往往呈现出非线性。非…...

python----线程、进程、协程的区别及多线程详解

文章目录 一、线程、进程、协程区别二、创建线程1、函数创建2、类创建 三、线程锁1、Lock2、死锁2.1加锁之后处理业务逻辑&#xff0c;在释放锁之前抛出异常&#xff0c;这时的锁没有正常释放&#xff0c;当前的线程因为异常终止了&#xff0c;就会产生死锁。2.2开启两个或两个…...

将 magma example 改写成 cusolver example eqrf

1&#xff0c;简单安装Magma 1.1 下载编译 OpenBLAS $ git clone https://github.com/OpenMathLib/OpenBLAS.git $ cd OpenBLAS/ $ make -j DEBUG1 $ make install PREFIX/home/hipper/ex_magma/local_d/OpenBLAS/1.2 下载编译 magma $ git clone https://bitbucket.org/icl…...

微信小程序教程007:数据绑定

文章目录 数据绑定1、数据绑定原则2、在data中定义页面数据3、Mustache语法的格式4、Mustache应用场景5、绑定属性6、三元运算8、算数运算数据绑定 1、数据绑定原则 在data中定义数据在WXML中使用数据2、在data中定义页面数据 在页面对应的.js文件中,把数据定义到data对象中…...

Git -- git stash 暂存

使用 git 或多或少都会了解到 git stash 命令&#xff0c;但是可能未曾经常使用&#xff0c;下面简单介绍两种使用场景。 场景一&#xff1a;分支A开发&#xff0c;分支B解决bug 我们遇到最常见的例子就是&#xff0c;在当前分支 A 上开发写需求&#xff0c;但是 B 分支上有…...

基于YOLO的植物病害识别系统:从训练到部署全攻略

基于深度学习的植物叶片病害识别系统&#xff08;UI界面YOLOv8/v7/v6/v5代码训练数据集&#xff09; 1. 引言 在农业生产中&#xff0c;植物叶片病害是影响作物产量和质量的主要因素之一。传统的病害检测方法依赖于人工识别&#xff0c;效率低且易受主观因素影响。随着深度学…...

数据库开发:MySQL基础(二)

MySQL基础&#xff08;二&#xff09; 一、表的关联关系 在关系型数据库中&#xff0c;表之间可以通过关联关系进行连接和查询。关联关系是指两个或多个表之间的关系&#xff0c;通过共享相同的列或键来建立连接。常见的关联关系有三种类型&#xff1a;一对多关系&#xff0c;…...

实现物理数据库迁移到云上

实现物理数据库迁移到云上 以下是一个PHP脚本&#xff0c;用于实现物理数据库迁移到云上的步骤&#xff1a; <?php// 评估和规划 $databaseSize "100GB"; $performanceRequirements "high"; $dataComplexity "medium";$cloudProvider &…...

[Spring] MyBatis操作数据库(进阶)

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…...

【Websim.ai】一句话让AI帮你生成一个网页

【Websim.ai】一句话让AI帮你生成一个网页 网站链接 websim.ai 简介 websim.ai接入了Claude Sonnet 3.5&#xff0c;GPT-4o等常用的LLM&#xff0c;只需要在websim.ai的官网指令栏中编写相关指令&#xff0c;有点类似大模型的Prompt&#xff0c;指令的好坏决定了网页生成的…...

云计算实训16——关于web,http协议,https协议,apache,nginx的学习与认知

一、web基本概念和常识 1.Web Web 服务是动态的、可交互的、跨平台的和图形化的为⽤户提供的⼀种在互联⽹上浏览信息的服务。 2.web服务器&#xff08;web server&#xff09; 也称HTTP服务器&#xff08;HTTP server&#xff09;&#xff0c;主要有 Nginx、Apache、Tomcat 等。…...