JAVA中的线程、死锁、异常

news2025/1/6 18:02:11

线程

Thread

  • 一、程序
    • 1.一段静态代码(静态)
  • 二、进程
    • 1.动态的,有开始,有结束;
    • 2.程序的一次执行过程,
    • 3.操作系统调度分配资源的最小单位;
  • 三、线程
    • 1.进程细化为线程
    • 2.内部的一条执行路径;
    • 3.多线程,
    • 4.CPI调度、分配的最小单位;
    • 5.多线程间可以通信,一个进程共享一个堆;(会有安全问题);
    • 6.每个进程有一个独立的内存空间;
    • 7.线程调度
      • (1)分时调度;(平均分配每个时间)
      • (2)抢占式调度;(java);提高响应,设置优先级;

并行:

  • 1、多个事件,同一时间发生;
  • 2、多条指令在多个cpu上同时执行;(多核)
  • 3、三个大厨在炒菜;

并发:

  • 1、多个事件,在同一个时间段内发生;(同一时刻可能只有一个)
  • 2、Cpu快速切换处理;
  • 3、一个大厨在炒三个菜;

线程:java.lang.Thread

  • 1、创建:
    • (1)继承thread类
      • ①创建子类继承Thread,
      • ②重写run方法
      • ③创建对象
      • ④调用start方法;
        • 1)启动线程
        • 2)调用当前线程的run方法;
        • 3)结束前不能继续调start;不能让已经start的线程继续start否则报异常;
      • ⑤多个线程间的执行没有冲突,同时执行;

例1

class F extends Thread {
    @Override
    public void run() {
        System.out.println(1);
    }
}

例2

class H extends Thread {
    static Object obj = new Object();
    static int total = 100;
    @Override
    public void run() {
        /* 同步代码块 */
        /* 使用static修饰后可以保证obj的唯一性 */
        synchronized (obj) {
            H.total--;
            System.out.println(H.total);
        }

        /*此处this不能保证唯一性/慎用*/
        synchronized (this) {
            H.total--;
        }
        synchronized (Window.class) {
            H.total--;
        }
        synchronized (H.class) {
            H.total--;
        }
    }
}

例3

public class ThreadTest {
    @Test
    public void test(){
        A a = new A();
        a.start(); //开始创建新线程;
        /* 还是主线程 */
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName() + ": " + i);
        }
        A a2 = new A();
        a2.start();
        /* 匿名对象 */

        new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                if(i%2==0) {
                    System.out.println(Thread.currentThread().getName() + ": " + i);
                }
            }
        }).start();
    }
}

class A extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            if(i%2==0) {
                System.out.println(Thread.currentThread().getName() + ": " + i);
            }
        }
    }
}
  • (2)实现Runnable接口
    • ①创建一个实现类
    • ②实现接口内的抽象run方法
    • ③创建对象
    • ④将对象作为参数,传入Thread构造器;创建实例
    • ⑤创建实例后,调用start方法;
class J implements Runnable{
    int i = 100;
    @Override
    public void run() {
//        synchronized (J.class){
//            method();
//        }
        i--;
    }
    public void method() {
        i--;
    }
    /* 同步方法 */
    public synchronized void method2() {
        i--;
    }
}
public class ThreadTest2 {
    public static void main(String[] args) {
        B b = new B();
//        new Thread(b){}.start();
        Thread t = new Thread(b);
        t.start();

        for (int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread().getName()+ ": " + i);
        }

        Thread t2 = new Thread(b);
        t2.start();
        /* 有问题的写法? */
        new Thread(b){
            @Override
            public void run() {
                for (int i = 6; i < 10; i++) {
                    System.out.println(Thread.currentThread().getName()+ ": " + i);
                }
            }
        }.start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 5; i++) {
                    System.out.println(Thread.currentThread().getName()+ ": " + i);
                }
            }
        }).start();
    }
}
class B implements Runnable {

    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread().getName()+ ": " + i);
        }
    }
}
public class ThreadTest3 {
    public static void main(String[] args) throws InterruptedException {
        D d = new D();
        Thread t = new Thread(d);
        t.setName("子线程");
        t.setPriority(Thread.MIN_PRIORITY);
        t.start();
        Thread.currentThread().setName("主线程");
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName() + ": " + i);
            if(i == 3) {
                t.join();
            }
            System.out.println(Thread.currentThread().getPriority());
        }
    }
}

class D implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName() + "_" + Thread.currentThread().getPriority() + ": " + i);
            if(i % 3 == 0) {
//                Thread.yield();

            }
        }
    }
}

建议:

  • 1、建议使用Runnable 方式
    • (1)避免了类的单继承性的局限性
    • (2)更适合处理有共享数据的情况

联系:

  • 1、Thread 类 本来也是实现的Runnable的方法;

常用方法:

  • 1、start
  • 2、Run:线程内主要需要的任务
  • 3、currenctThread(): 获取当前线程
  • 4、getName(): 获取线程的名称;
  • 5、SetName: 设置线程名称
  • 6、Sleep(ms): 静态方法:
    • (1)当前线程休眠指定毫秒数;
    • (2)会抛出异常;
  • 7、Yield();静态方法
    • (1)主动释放cpu的执行权
    • (2)Cpu可能去执行其他的线程;
    • (3)也可能很快继续分配回来;
  • 8、Join(); 在线程A中通过线程B调用join方法;之后线程A被阻塞,直到B执行结束;
  • 9、isAlive(); 线程是否存活
  • 10、过时方法:stop,强行结束一个线程,使其死亡。不建议使用;
  • 11、Suspend/resume; 操作失误可能造成死锁,不建议使用;
    • (1)Suspend: 暂停
    • (2)Resume:继续;

生命周期:

  • 1、Jdk1.5之前

    • (1)在这里插入图片描述
  • 2、Jdk 1.5 及之后

    • (1)在这里插入图片描述

    • (2)阻塞分的更细了

    • (3)可以查看Thread的enum枚举类State;

优先级:

  • 1、getPriority(); 获取优先级;
    • (1)默认级别都是5;
    • (2)最低的是1,最高的是10;
  • 2、THread 内部常量:
    • (1)MIN_PRIORITY: 1;
    • (2)MAX_ : 10
    • (3)NORMAL_ 5;
  • 3、setPriority(): 设置优先级;
    • (1)设置完之后不一定是哪个优先
    • (2)内部有cpu等规则;
  • 4、

线程安全

使用线程的同步机制

1、同步代码块

* (1)synchronized(同步监视器) {
    * ①需要被同步的代码
    * ②被操作的共享数据;
* };
  • ******代码块被视为一个整体,使用syncxxx包裹后,一个线程结束后。另一个线 程才能执行;
  • (2)同步监视器
  • ①俗称锁;
  • ②可以使用任何一个类的对象充当;
  • ③多个线程,必须公用同一个同步监视器;
  • ④这个对象必须是唯一的;可以尝试使用this;
  • ⑤可以使用Window.class;
  • ⑥可以使用当前类.class;
  • (3)Ctrl+alt+t

2、同步方法;

  • (1)S 如果操作共享数据的代码,在一个方法中
  • (2)直接给方法添加修饰符:synchronzied;
  • (3)非静态同步监视器默认就是this;(不可修改)
    • ①此时考虑this是否唯一;
  • (4)如果可以改成静态方法,可以考虑使用静态方法;
    • ①默认的监视器是当前类.class;
  • (5)如果this不唯一;
    • ①类声明多个实例的情况会有不唯一的情况;
  • (6)
public class WaitTest {
    public static void main(String[] args) {
        WaitTest wt = new WaitTest();
        wt.method();
    }
    public synchronized void method(){

        System.out.println(1);
        try {
            this.wait(1000);
            System.out.println(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        this.notify();
        System.out.println(2);
    }
    //wait 中添加了时间之后打印顺序: 1-3-2;
    // wait 中不添加时间的话,只打印1;
}

推荐使用implements Runnable;方式;

5.0新特性:Lock

public class LockTest {
    private static final ReentrantLock lock = new ReentrantLock();

    public static void main(String[] args) {

    }
    public void  method() {
        try {
            lock.lock();
            new Thread(){
                @Override
                public void run() {
                    System.out.println(1);
                }
            }.start();
        } finally {
            lock.unlock(); //为保证unlock被执行,放到finally中;
        }
    }
}

指令重排?是什么

  • 1、volatile 修饰符避免
  • 2、Volatile A a= new A();

死锁

  • 1、互相抢占资源,等待对方释放;
  • 2、每人一个监视器,等待对方释放监视器
  • 3、拿不到监视器,对面不释放;
  • 4、见代码:DeadLockTest.java; 加上sleep后可以高概率复现死锁;
public class DeadLockTest {
    public static void main(String[] args) {
        StringBuilder s1 = new StringBuilder();
        StringBuilder s2 = new StringBuilder();

        new Thread(){
            @Override
            public void run() {
                synchronized (s1){
                    s1.append("a");
                    s2.append("1");
                    /* 加上sleep之后1秒之内不会释放,另一个线程等着用s1;这个线程等着用s2 */
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (s2){
                        s1.append("b");
                        s2.append("2");
                    }
                    System.out.println(s1);
                    System.out.println(s2);
                }
            }
        }.start();

        new Thread(){
            @Override
            public void run() {
                synchronized (s2){
                    s2.append("-3");
                    s1.append("-c");

                    synchronized (s1){
                        s2.append("4");
                        s1.append("d");
                    }
                    System.out.println(s1);
                    System.out.println(s2);
                }
            }
        }.start();
    }
}

如何看待:

  • 1、避免;

原因及解决避免:(破坏死锁的形成条件)

  • 1、互斥条件:=>
    • (1)无法处理;
  • 2、占用且等待: =>
    • (1)一次性拿到所有资源;
  • 3、不可抢夺: =>
    • (1)申请不到资源时,主动释放资源;
  • 4、循环等待: =>
    • (1)改为线性顺序;排号;

Lock锁:

  • 1、解决线程安全;
  • 2、JUC:=> java.util.concurrent;
  • 3、Private static [final] ReentrantLock lock = new RenntrantLock();
  • 4、lock.lock();
    • (1)可能不安全的逻辑;
  • 5、lock.unlock(); => 必须要保证一定会执行;
  • Lock锁定对共享资源的调用;
  • Lock好过synchronized;lock不需要包上正片代码

线程通信

一、两个线程,交替打印12345678.。。

  • 1.See the code;
    • Wait();
  • 1、wait(); //进入等待并释放对同步监视器的调用;而sleep不会释放;
  • 2、Notify(); //唤醒wait;
    • (1)只能唤醒一个
    • (2)唤醒被wait中优先级最高的
    • (3)如果优先级相同,则随机唤醒;
    • (4)然后被唤醒的,继续上次被wait的地方继续执行;
  • 3、NotifyAll(): 唤醒所有wait的线程;
public class CommunicationTest {
    public static void main(String[] args) {
        Q q = new Q();
        Thread t1 = new Thread(q);
        Thread t2 = new Thread(q);
        t1.start();
        t2.start();
    }
}
class Q implements Runnable {
    static Object obj = new Object();
    private static int count = 100;

    @Override
    public void run() {
        while (true) {
            synchronized (obj) {   // 因为和notify和wait的调用者不一致了;

//                notify(); //唤起wait
                obj.notify(); //唤起wait

                if (count > 0) {
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    System.out.println(Thread.currentThread().getName() + ": " + count);
                    count--;

                    try {
                        obj.wait(); //进入等待并释放对同步监视器的调用;
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                } else {
                    break;
                }
            }


        }
    }
}
/* 实现两个线程交替打印 */
//class Q implements Runnable {
//    static Object obj = new Object();
//    private static int count = 100;
//
//    @Override
//    public void run() {
//        while (true) {
//            synchronized (this) {   //此处除了使用this,使用其他的都会报错;因为和notify和wait的调用者不一致了;
//
                notify(); //唤起wait
//                this.notify(); //唤起wait
//
//                if (count > 0) {
//                    try {
//                        Thread.sleep(10);
//                    } catch (InterruptedException e) {
//                        e.printStackTrace();
//                    }
//
//                    System.out.println(Thread.currentThread().getName() + ": " + count);
//                    count--;
//
//                    try {
//                        wait(); //进入等待并释放对同步监视器的调用;
//                    } catch (InterruptedException e) {
//                        e.printStackTrace();
//                    }
//
//                } else {
//                    break;
//                }
//            }
//
//
//        }
//    }
//}

//class Q implements Runnable {
//    private  static  int count = 100;
//    @Override
//    public void run() {
//        while (count > 0) {
//            try {
//                Thread.sleep(10);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//            synchronized (Q.class){
//                System.out.println(Thread.currentThread().getName() +": "+count);
//                count--;
//            }
//        }
//    }
//}

使用:

  • 1、必须用在同步代码块,或者同步方法中;(synchronized)
  • 2、不能和lock搭配使用;
  • 3、Lock需要配合condition通信(更灵活);
  • 4、监视器必须和wait和notify的调用者一致;

创建线程

  • 1、Callable: 5.0新增;
/**
 * @Date 2023/8/3 14:51
 * @Discrition  非完全代码;callable 需要结合 futureTask 来使用;
 */
public class ClassableTest {
    public static void main(String[] args) {
        W w = new W();
        w.call();
//        try {
//            w.call();
//        } catch (Exception e) {
//            throw new RuntimeException(e);
//        }
    }
}

class W implements Callable {
    @Override
    public Object call() {
        synchronized (W.class) {
            System.out.println(1);
        }
        return null;
    }

//    public Object call() throws Exception {
//        synchronized (W.class) {
//            System.out.println(1);
//        }
//        return null;
//    }
}
  • 2、线程池:生产中使用;

线程池:

  • 1、先创建好多个空线程,等待任务来了执行;可以复用;
public class ThreadPondTest {
    public static void main(String[] args) {
//        ThreadPoolExecutor executor = new ThreadPoolExecutor();
    }
}

class R {

}

异常

Throwable两个子类:

1、Error

  • (1)处理方式:只能改代码;(jvm资源耗尽,无法处理)
  • (2)错误类型:
    • ①Stack Overflow Error;栈溢出
    • ②OutOfMemoryError;堆内存移除;==>OOM

2、Exception

  • (1)可以处理,通过代码catch让程序继续执行;
  • (2)区分:
    • ①Java~运行时异常:只有一个(runtimeException=>扩展开还有很多)
    • ②Javac~编译时异常

Exception:

  • 1、将无线重复的ifelse=》改为。。。
  • 2、将所有可能报错的放在一起处理下;
public class ThrowsTest {
    @Test
    public void test(){
        try {
            ThrowsTest.method1();
        }finally {
            System.out.println(1);
        }
        System.out.println(2);
    }
    public static void method1() throws OutOfMemoryError{
        int[] arr = new int[] {1,2};
        System.out.println(arr[2]);
        System.out.println(3);
    }
    @Test
    public void test2(){
        new B();
    }
}
class A {
    void method1() throws NullPointerException{

    }
}
class B extends A{
    void method1(){

    }
}

处理方式:

方式一 try-catch-finally(抓抛模型)**

1、自定义逻辑

  • (1)抛出: 产生异常对象,抛出;
  • (2)抓:捕获并处理,处理后代码可以继续执行;
  • (3)Finally 无论什么情况,代码块内都会执行;

2、printStackTrace (最常用-推荐)打印堆栈信息

  • (1)1111
  • 3、
  • 4、
  • 5、
  • 6、 运行时异常不做处理,主要处理编译时异常;

Catch结构顺序:

  • 1、如果有多个catch结构,其中的异常类型无子父类关系则无顺序
  • 2、如果有子父类关系,则父类要放到后面;

Finally:

  • 1、在catch还存在异常的话,后面的代码不放到finally中的话不会被执行;
  • 2、一定要被执行的语句,放到finally中;
  • 3、Finally比catch先执行;
  • 4、Finally比try中先执行;

System.exit(0); 虚拟机强行结束;

方式二

  • 1、Throws
  • 2、格式:
    • (1)Throws 类型1, 类型2 。。。 ;
    • (2)Public void test() throws NullxxxxException{}
  • 3、是否解决了异常
    • (1)向上抛出,不算真正解决;需要调用者来继续处理;

继承:

  • 1、父类方法使用了throws,子类的方法如果也使用throws则必须为同类型异常,或子类异常,可以不是用throws;
  • 2、RuntimeException 这个范围类型写了没用;
  • 3、如果父类的方法没有抛出异常,则子类方法中不能抛出异常;

手动抛出异常:throw;

  • 1、throw new Object(“description”);
public class ThrowsTest {
    @Test
    public void test(){
        try {
            ThrowsTest.method1();
        }finally {
            System.out.println(1);
        }
        System.out.println(2);
    }
    public static void method1() throws OutOfMemoryError{
        int[] arr = new int[] {1,2};
        System.out.println(arr[2]);
        System.out.println(3);
    }
    @Test
    public void test2(){
        new B();
    }
}
class A {
    void method1() throws NullPointerException{

    }
}
class B extends A{
    void method1(){

    }
}

自定义异常

  • 1、创建类继承自某个异常类;
  • 2、通常继承自 RuntimeException 或者Exception;
public class DIYException extends RuntimeException{
}
  • 3、空参构造器
  • 4、形参构造器
  • 5、常量(序列版本号);
  • 6、,即可抛出
public class ManuThrowTest {
    int i = 1;
    @Test
    public void test(){
        this.i = 0;
        this.method1();
    }
    public void method1(){
        if(this.i > 0) {

        }else {
            throw new  NullPointerException("ghjg");
        }
    }
    public void method2() throws Exception {
        throw new Exception("123"); //必须搭配处理;(因为是编译时错误)
    }
    public void method3() {
        throw new DIYException(); //自定义异常类;
    }
}

为什么要自定义?

  • 1、见名知意;
  • 2、已有类型不足以见名知意;

~~~~运行时异常可以不处理,编译时异常必须要处理;或trycatch或throws~~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1651545.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图形渲染在AI去衣技术中的奇妙之旅

在这个数字化飞速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;已经成为了我们生活中不可或缺的一部分。它像一位神秘的魔法师&#xff0c;以其不可思议的力量改变着我们的世界。今天&#xff0c;我要和大家探讨的&#xff0c;是一个颇具争议却技术含金量极高的话…

群晖上部署农场管理系统farmOS

什么是 farmOS &#xff1f; farmOS 是一个基于 Web 的应用程序&#xff0c;用于农场管理、规划和记录保存。它由志愿者社区开发&#xff0c;旨在为农民、开发人员和研究人员提供一个标准平台。 需要注意的是&#xff0c;群晖内核版本太低会遇到下面的错误&#xff0c;这个 AH0…

2024暨南大学校赛热身赛解析

文章目录 A 突发恶疾B Uzi 的真身C 时间管理大师D 基站建设E 在仙境之外weiwandaixu 题目地址 A 突发恶疾 斐波那契数列 fn [0]*1000006fn[0],fn[1] 0,1for i in range(2,1000002):fn[i] (fn[i-1]fn[i-2])%998244353n int(input()) print(fn[n])B Uzi 的真身 分析&#xff…

SSM【Spring SpringMVC Mybatis】——Maven

目录 1、为什么使用Maven 1️⃣获取jar包 2️⃣添加jar包 3️⃣使用Maven便于解决jar包冲突及依赖问题 2、什么是Maven 3、Maven基本使用 3.1 Maven准备 3.2 Maven基本配置 3.3 Maven之Helloworld 4、Maven及Idea的相关应用 4.1 将Maven整合到IDEA中 4.2 在IDEA中新建…

使用脚本一键部署项目的示例(脚本会创建syetemctl的系统服务)

文章目录 说明使用脚本一键部署本项目开启/停止服务开启/关闭开机自动运行更新项目 参考地址&#xff1a;https://github.com/Evil0ctal/Douyin_TikTok_Download_API?tabreadme-ov-file 说明 后续相关项目可以使用这种方式创建脚本&#xff0c;脚本均放置在项目根目录下的bas…

【C++干货基地】揭秘C++STL库的魅力:stiring的初步了解和使用

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 哈喽各位铁汁们好啊&#xff0c;我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发&#xff0c;不知道各位的…

AI大模型探索之路-训练篇17:大语言模型预训练-微调技术之QLoRA

系列篇章&#x1f4a5; AI大模型探索之路-训练篇1&#xff1a;大语言模型微调基础认知 AI大模型探索之路-训练篇2&#xff1a;大语言模型预训练基础认知 AI大模型探索之路-训练篇3&#xff1a;大语言模型全景解读 AI大模型探索之路-训练篇4&#xff1a;大语言模型训练数据集概…

动态规划——路径问题:LCR 166.珠宝的最高价值

文章目录 题目描述算法原理1.状态表示&#xff08;题目经验&#xff09;2.状态转移方程3.初始化4.填表顺序5.返回值 代码实现CJava 题目描述 题目链接&#xff1a;LCR 166.珠宝的最高价值 算法原理 1.状态表示&#xff08;题目经验&#xff09; 对于这种路径类的问题&…

Linux中动态库的用法及优缺点?怎样制作动态库和静态库?

一、什么是gcc gcc的全称是GNU Compiler Collection&#xff0c;它是一个能够编译多种语言的编译器。最开始gcc是作为C语言的编译器&#xff08;GNU C Compiler&#xff09;&#xff0c;现在除了c语言&#xff0c;还支持C、java、Pascal等语言。gcc支持多种硬件平台. 在 Linux…

在做题中学习(52): 山脉数组的峰顶索引

852. 山脉数组的峰顶索引 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a;二分查找 思路&#xff1a;O(logn)的时间复杂度&#xff0c;很可能是二分法&#xff0c;再看看有没有二段性&#xff1a; 由题目可以知道&#xff0c;i的左边比i小&#xff0c;右边比i大&am…

47.Redis学习笔记

小林coding -> 图解redis的学习笔记 文章目录 Rediswindwos安装docker安装redis启动redis使用RDM访问虚拟机中的redispython连接redis缓存穿透、击穿、雪崩基本数据类型高级数据类型高并发指标布隆过滤器分布式锁Redis 的有序集合底层为什么要用跳表&#xff0c;而不用平衡…

Spring_概述

Spring 官网Spring Framework&#xff08;Spring&#xff09;文档位置重点内容Overview 官网 Spring官网 Spring Framework&#xff08;Spring&#xff09; 文档位置 重点 IoC容器AOP&#xff1a;面向切面编程AOT&#xff1a;ahead of time&#xff0c;提前编译Web 框架&…

面试分享——订单超30分钟未支付自动取消用什么实现?如何使用Redis实现延迟队列?

目录 1.订单超时未支付自动取消&#xff0c;这个你用什么方案实现&#xff1f; 2.如何使用Redis实现延迟队列 2.1实验步骤 2.2实现生产可用的延迟队列还需关注什么 3.总结 电商场景中的问题向来很受面试官的青睐&#xff0c;因为业务场景大家都相对更熟悉&#xff0c;相关…

金仓面对面 | 人大金仓×安硕信息共话金融信用风险管理数字化转型之道

金仓面对面 在数字化浪潮的推动下&#xff0c;人大金仓携手行业先锋&#xff0c;共同开启一场关于创新与转型的思想盛宴——金仓面对面。这不仅是一场对话&#xff0c;更是一次智慧的火花碰撞&#xff0c;一次行业数字化转型洞察的深度挖掘。 行业精英汇聚&#xff1a;我们荣幸…

SSH的魅力:为何它成为远程访问的首选

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Linux &#xff1a;从菜鸟到飞鸟的逆袭》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、SSH简介 2、SSH的历史与发展 3、SSH的主要用…

大学物理实验 期末复习笔记整理(个人复习笔记/侵删/有不足之处欢迎斧正)

一、误差和数据处理 1. 系统误差是指在重复性条件下&#xff0c;对同一被测量进行无限多次测量所得结果的平均值与被测量的真值之差。它通常是由于测量设备、测量方法或测量环境等因素引起的&#xff0c;具有重复性、单向性和可测性。而随机误差则是由于测量过程中一系列有关因…

CP AUTOSAR之CANXL Driver详细说明(正在更新中)

本文遵循autosar标准&#xff1a;R22-11 1 简介及功能概述 本规范描述了AUTOSAR 基础软件模块CAN XL 驱动程序的功能、API和配置。   本文档的基础是[1,CiA610-1]和[2,CiA611-1]。假设读者熟悉这些规范。本文档不会再次描述CAN XL 功能。   CAN XL 驱动程序是最低层的一部…

NETBIOS和DNS

Netbios NETBIOS只能工作在局域网。 NetBIOS&#xff08;Network Basic Input/Output System, 网络基本输入输出系统&#xff09;是一种接入服务网络的接口标准。主机系统通过WINS服务、广播及lmhosts文件多种模式&#xff0c;把NetBIOS名解析对应的IP地址&#xff0c;实现信…

MySQL中JOIN连接的实现算法

目录 嵌套循环算法&#xff08;NLJ&#xff09; 简单嵌套循环&#xff08;SNLJ&#xff09; 索引嵌套循环&#xff08;INLJ&#xff09; 块嵌套循环&#xff08;BNLJ&#xff09; 三种算法比较 哈希连接算法&#xff08;Hash Join&#xff09; 注意事项&#xff1a; 工…

Linux入门攻坚——22、通信安全基础知识及openssl、CA证书

Linux系统常用的加解密工具&#xff1a;OpenSSL&#xff0c;gpg&#xff08;是pgp的实现&#xff09; 加密算法和协议&#xff1a; 对称加密&#xff1a;加解密使用同一个秘钥&#xff1b; DES&#xff1a;Data Encryption Standard&#xff0c;数据加密标准&…