并发编程(线程)面试题总结2022

2023-11-08

目录

并发编程三要素是什么?在 Java 程序中怎么保证[多线程]的运行安全?

并发编程三要素(线程的安全性问题体现在):

原子性:原子,即一个不可再被分割的颗粒。原子性指的是一个或多个操作要么全部执行成功要么全部执行失败。

可见性:一个线程对共享变量的修改,另一个线程能够立刻看到。(synchronized,volatile)

有序性:程序执行的顺序按照代码的先后顺序执行。(处理器可能会对指令进行重排序)

出现线程安全问题的原因:

线程切换带来的原子性问题

缓存导致的可见性问题

编译优化带来的有序性问题

解决办法:

JDK Atomic开头的原子类、synchronized、LOCK,可以解决原子性问题
synchronized、volatile、LOCK,可以解决可见性问题
Happens-Before 规则可以解决有序性问题
什么是多线程,多线程的优劣?

多线程:多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务。

多线程的好处:

可以提高 CPU 的利用率。在多线程程序中,一个线程必须等待的时候,CPU 可以运行其它的线程而不是等待,这样就大大提高了程序的效率。也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。

多线程的劣势:

线程也是程序,所以线程需要占用内存,线程越多占用内存也越多;

多线程需要协调和管理,所以需要 CPU 时间跟踪线程;

线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题。
形成死锁的四个必要条件是什么

避免死锁的方法:破坏产生死锁的四个条件中的其中一个就可以了。

  1. 互斥条件:线程(进程)对于所分配到的资源具有排它性,即一个资源只能被一个线程(进程)占用,直到被该线程(进程)释放
  2. 请求与保持条件:一个线程(进程)因请求被占用资源而发生阻塞时,对已获得的资源保持不放。
  3. 不剥夺条件:线程(进程)已获得的资源在末使用完之前不能被其他线程强行剥夺,只有自己使用完毕后才释放资源。
  4. 循环等待条件:当发生死锁时,所等待的线程(进程)必定会形成一个环路(类似于死循环),造成永久阻塞
创建线程有哪几种方式?
  1. 继承 Thread 类;
  2. 实现 Runnable 接口;
  3. 实现 Callable 接口;
  4. 使用 Executors 工具类创建线程池
继承 Thread 类
  1. 定义一个Thread类的子类,重写run方法,将相关逻辑实现,run()方法就是线程要执行的业务逻辑方法
  2. 创建自定义的线程子类对象
  3. 调用子类实例的star()方法来启动线程
public class MyThread extends Thread {

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " run()方法正在执行...");
    }
}

----------------------------------------------------------------------------------------------------
public class TheadTest {

    public static void main(String[] args) {
        MyThread myThread = new MyThread(); 	
        myThread.start();
        System.out.println(Thread.currentThread().getName() + " main()方法执行结束");
    }
}
实现 Runnable 接口
  1. 定义MyRunnable类实现Runnable接口,并重写run()方法
  2. 定义测试类RunnableTest 实例化 自定义类MyRunnable 以myRunnable作为参数创建thread对象,该thread对象就是真正的线程对象
  3. 调用start()方法
public class MyRunnable implements Runnable {
  @Override
  public void run() {
      System.out.println(Thread.currentThread().getName() + " run()方法执行中...");
  }
}

-------------------------------------------------------------------------------------------------
public class RunnableTest {

    public static void main(String[] args) {
        MyRunnable myRunnable = new MyRunnable();
        Thread thread = new Thread(myRunnable);
        thread.start();
        System.out.println(Thread.currentThread().getName() + " main()方法执行完成");
    }
}
实现 Callable 接口
  1. 创建myCallable类实现Callable接口
  2. 以myCallable为参数创建FutureTask对象
  3. 将FutureTask作为参数创建Thread对象
  4. 调用线程对象的start()方法
public class MyCallable implements Callable<Integer> {

    @Override
    public Integer call() {
        System.out.println(Thread.currentThread().getName() + " call()方法执行中...");
        return 1;
    }

}

------------------------------------------------------------------------------------------------------
public class CallableTest {

    public static void main(String[] args) {
        FutureTask<Integer> futureTask = new FutureTask<Integer>(new MyCallable());
        Thread thread = new Thread(futureTask);
        thread.start();

        try {
            Thread.sleep(1000);
            System.out.println("返回结果 " + futureTask.get());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + " main()方法执行完成");
    }
}
说一下 runnable 和 callable 有什么区别?

相同点

  • 都是接口
  • 都可以编写多线程程序
  • 都采用Thread.start()启动线程

主要区别

  • Runnable 接口 run 方法无返回值;Callable 接口 call 方法有返回值,是个泛型,和Future、FutureTask配合可以用来获取异步执行的结果
  • Runnable 接口 run 方法只能抛出运行时异常,且无法捕获处理;Callable 接口 call 方法允许抛出异常,可以获取异常信息

:Callalbe接口支持返回执行结果,需要调用FutureTask.get()得到,此方法会阻塞主进程的继续往下执行,如果不调用不会阻塞。

线程的 run()和 start()有什么区别?
  1. run()方法称为线程体。通过调用Thread类的start()方法来启动一个线程。
  2. start() 方法用于启动线程,run() 方法用于执行线程的运行时代码。
  3. run() 可以重复调用,而 start() 只能调用一次。
  4. start()方法来启动一个线程,真正实现了多线程运行。run()方法是在本线程里的,只是线程里的一个函数,而不是多线程的。
为什么我们调用 start() 方法时会执行 run() 方法,为什么我们不能直接调用 run() 方法?
new 一个 Thread,线程进入了新建状态。调用 start() 方法,会启动一个线程并使线程进入了就绪状态,当分配到时间片后就可以开始运行了。 start() 会执行线程的相应准备工作,然后自动执行 run() 方法的内容,这是真正的多线程工作。

而直接执行 run() 方法,会把 run 方法当成一个 main 线程下的普通方法去执行,并不会在某个线程中执行它,所以这并不是多线程工作。

总结: 调用 start 方法方可启动线程并使线程进入就绪状态,而 run 方法只是 thread 的一个普通方法调用,还是在主线程里执行。

说说线程的生命周期及五种基本状态?

在这里插入图片描述

  1. 新建:新创建了一个线程对象

  2. 可运行:线程对象创建后,当调用线程对象的start()方法,该线程处于就绪状态,等待被线程调度选中,获取cpu的使用权。

  3. 运行:可运行状态的线程获得了时间片,执行程序代码,注:就绪状态是进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中;

  4. 阻塞:处于运行状态中的线程由于某种原因,暂时放弃对 CPU的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才有机会再次被 CPU 调用以进入到运行状态。

    阻塞的情况分为三种:

    1、等待阻塞:运行中的线程执行wait()方法,JVM会把线程导入到等待队列中,使本线程进入到等待阻塞状态
    2、同步阻塞:线程在获取 synchronized 同步锁失败(因为锁被其它线程所占用),则JVM会把该线程放入锁池(lock pool)中,线程会进入同步阻塞状态;
    3、其他阻塞: 通过调用线程的 sleep()或 join()或发出了 I/O 请求时,线程会进入到阻塞状态。当 sleep()状态超时、join()等待线程终止或者超时、或者 I/O 处理完毕时,线程重新转入就绪状态。
    

  5. 死亡:线程run()、main()方法执行结束,或者因异常退出了run()方法,则该线程结束生命周期。死亡的线程不可再次复生。

sleep() 和 wait() 有什么区别?

两者都可以暂停线程的执行

  • 类的不同:sleep() 是 Thread线程类的静态方法,wait() 是 Object类的方法。
  • 是否释放锁:sleep() 不释放锁;wait() 释放锁。
  • 用途不同:Wait 通常被用于线程间交互/通信,sleep 通常被用于暂停执行。
  • 用法不同:wait() 方法被调用后,线程不会自动苏醒,需要别的线程调用同一个对象上的 notify() 或者 notifyAll() 方法。sleep() 方法执行完成后,线程会自动苏醒。或者可以使用wait(long timeout)超时后线程会自动苏醒。
synchronized
synchronized 的作用?

synchronized 关键字是用来控制线程同步的,就是在多线程的环境下,控制 synchronized 代码段不被多个线程同时执行。synchronized 可以修饰类、方法、变量。

synchronized关键字最主要的三种使用方式:
  • 修饰实例方法: 作用于当前对象实例加锁,进入同步代码前要获得当前对象实例的锁
  • 修饰静态方法: 也就是给当前类加锁,会作用于类的所有对象实例,因为静态成员不属于任何一个实例对象,是类成员( static 表明这是该类的一个静态资源,不管new了多少个对象,只有一份)。所以如果一个线程A调用一个实例对象的非静态 synchronized 方法,而线程B需要调用这个实例对象所属类的静态 synchronized 方法,是允许的,不会发生互斥现象,因为访问静态 synchronized 方法占用的锁是当前类的锁,而访问非静态 synchronized 方法占用的锁是当前实例对象锁。
  • 修饰代码块: 指定加锁对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。

总结: synchronized 关键字加到 static 静态方法和 synchronized(class)代码块上都是是给 Class 类上锁。synchronized 关键字加到实例方法上是给对象实例上锁。尽量不要使用 synchronized(String a) 因为JVM中,字符串常量池具有缓存功能!

当一个线程进入一个对象的 synchronized 方法 A 之后,其它线程是否可进入此对象的 synchronized 方法 B?

不能。其它线程只能访问该对象的非同步方法,同步方法则不能进入。因为非静态方法上的 synchronized 修饰符要求执行方法时要获得对象的锁,如果已经进入A 方法说明对象锁已经被取走,那么试图进入 B 方法的线程就只能在等锁池(注意不是等待池哦)中等待对象的锁。

synchronized、volatile、CAS 比较
  • synchronized 是悲观锁,属于抢占式,会引起其他线程阻塞。
  • volatile 提供多线程共享变量可见性和禁止指令重排序优化。
  • CAS 是基于冲突检测的乐观锁(非阻塞)
synchronized 和 Lock 有什么区别?
  • 首先synchronized是Java内置关键字,在JVM层面,Lock是个Java类;
  • synchronized 可以给类、方法、代码块加锁;而 lock 只能给代码块加锁。

  • synchronized 不需要手动获取锁和释放锁,使用简单,发生异常会自动释放锁,不会造成死锁;而 lock 需要自己加锁和释放锁,如果使用不当没有 unLock()去释放锁就会造成死锁。

  • 通过 Lock 可以知道有没有成功获取锁,而 synchronized 却无法办到。

synchronized 和 ReentrantLock 区别是什么?

可重入锁”概念:自己可以再次获取自己的内部锁。比如一个线程获得了某个对象的锁,此时这个对象锁还没有释放,当其再次想要获取这个对象的锁的时候还是可以获取的,如果不可锁重入的话,就会造成死锁。同一个线程每次获取锁,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁。

synchronized是关键字,ReentrantLock是类 对比起来后者有更加灵活的特性,可以被继承,可以有方法,可以有类变量

相同点:两者都是可重入锁

主要区别如下:

* ReentrantLock 使用起来比较灵活,但是必须有释放锁的配合动作;
* ReentrantLock 必须手动获取与释放锁,而 synchronized 不需要手动释放和开启锁;
* ReentrantLock 只适用于代码块锁,而 synchronized 可以修饰类、方法、变量等。
* 二者的锁机制其实也是不一样的。ReentrantLock 底层调用的是 Unsafe 的park 方法加锁,synchronized 操作的应该是对象头中 mark word

synchronized 总结:

Java中每一个对象都可以作为锁,这是synchronized实现同步的基础:

  • 普通同步方法,锁是当前实例对象
  • 静态同步方法,锁是当前类的class对象
  • 同步方法块,锁是括号里面的对象
volatile

volatile关键字的作用: volatile 关键字来保证可见性和禁止指令重排。当一个共享变量被 volatile 修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。

从实践角度来看:volatile 的一个重要作用就是和 CAS 结合,保证了原子性。

volatile 常用于多线程环境下的单次操作(单次读或者单次写)。

synchronized 和 volatile 的区别是什么?

synchronized 表示只有一个线程可以获取作用对象的锁,执行代码,阻塞其他线程。

volatile 表示变量在 CPU 的寄存器中是不确定的,必须从主存中读取。保证多线程环境下变量的可见性;禁止指令重排序。

二者的区别:

  • volatile 是变量修饰符;synchronized 可以修饰类、方法、变量。
  • volatile 仅能实现变量的修改可见性,不能保证原子性;而 synchronized 则可以保证变量的修改可见性和原子性。
  • volatile 不会造成线程的阻塞;synchronized 可能会造成线程的阻塞。
  • volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化。
  • volatile关键字是线程同步的轻量级实现,所以性能方面比synchronized要好,但是volatile关键字只能用于变量而synchronized关键字可以修饰方法以及代码块。实际开发中使用 synchronized 关键字的场景还是更多一些
乐观锁和悲观锁的理解及如何实现,有哪些实现方式?

悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。

乐观锁:顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型

什么是CAS

cas 是一种基于锁的操作,而且是乐观锁。在 java 中锁分为乐观锁和悲观锁。悲观锁是将资源锁住,等一个之前获得锁的线程释放锁之后,下一个线程才可以访问。而乐观锁采取了一种宽泛的态度,通过某种方式不加锁来处理资源,比如通过给记录加 version 来获取数据,性能较悲观锁有很大的提高。

CAS 的会产生什么问题?

1、ABA 问题:

比如说一个线程 one 从内存位置 V 中取出 A,这时候另一个线程 two 也从内存中取出 A,并且 two 进行了一些操作变成了 B,然后 two 又将 V 位置的数据变成 A,这时候线程 one 进行 CAS 操作发现内存中仍然是 A,然后 one 操作成功。尽管线程 one 的 CAS 操作成功,但可能存在潜藏的问题。从 Java1.5 开始 JDK 的 atomic包里提供了一个类 AtomicStampedReference 来解决 ABA 问题。

2、循环时间长开销大:

对于资源竞争严重(线程冲突严重)的情况,CAS 自旋的概率会比较大,从而浪费更多的 CPU 资源,效率低于 synchronized。

3、只能保证一个共享变量的原子操作:

当对一个共享变量执行操作时,我们可以使用循环 CAS 的方式来保证原子操作,但是对多个共享变量操作时,循环 CAS 就无法保证操作的原子性,这个时候就可以用锁。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

并发编程(线程)面试题总结2022 的相关文章

  • 多线程-Thread类的常用方法及使用场景

    众所周知 操作线程就必须熟读线程的API方法 万一你开个多线程刹不住车就歇菜了 下面就介绍一些API基本用法 包括sleep join yield interrupt sleep 让当前线程睡一会 原生用法Thread sleep 毫秒 会
  • JUC三连问

    1 进程和线程的区别 1 进程是资源分配的基本单位 线程是程序执行的最小单位 2 一个进程包括多个线程 3 每个进程都有自己的内存和资源 一个进程中的线程会共享这些内存和资源 每个线程都有单独的栈内存 和寄存器 2 并行和并发的区别 并行指
  • 什么是ConcurrentHashMap?

    文章目录 什么是ConcurrentHashMap ConcurrentHashMap 的主要特性 ConcurrentHashMap 的用法 ConcurrentHashMap 的实现原理 在什么场景使用ConcurrentHashMap
  • 并发编程(线程)面试题总结2022

    目录 并发编程三要素是什么 在 Java 程序中怎么保证 多线程 的运行安全 什么是多线程 多线程的优劣 形成死锁的四个必要条件是什么 创建线程有哪几种方式 继承 Thread 类 实现 Runnable 接口 实现 Callable 接口
  • Synchronized实现原理

    查看带有Synchronized语句块的class文件可以看到在同步代码块的起始位置插入了moniterenter指令 在同步代码块结束的位置插入了monitorexit指令 JVM需要保证每一个monitorenter都有一个monito
  • Java并发编程系列 - Java内存模型

    Java并发编程 可见性 原子性 有序性 Java内存模型如何解决可见性 有序性 并发问题产生的根源 可见性 原子性 有序性 可见性 Java内存模型的主要目标是定义程序中变量的访问规则 即在虚拟机中将变量存储到主内存或者将变量从主内存取出
  • 并发编程系列之volatile内存语义

    前言 前面介绍顺序一致性模型时 我们提到了程序如果正确的同步就会具备顺序一致性 这里所说的同步泛指广义上的同步 其中包括就包括同步原语volatile 那么volatile声明的变量为什么就能保证同步呢 这又是如何实现的呢 今天就让我们一起
  • Java并发编程的相关知识(7)-阻塞队列

    阻塞队列 ArrayBlockingQueue LinkedBlockingQueue ProiorityBlockingQueue DelayQueue SynchronousQueue LinkedTransferQueue Linke
  • Callable接口详解

    Callable接口详解 Callable 返回结果并且可能抛出异常的任务 优点 可以获得任务执行返回值 通过与Future的结合 可以实现利用Future来跟踪异步计算的结果 Runnable和Callable的区别 1 Callable
  • JUC学习笔记及拓展

    本文为自己整理的学习笔记及学习心得 大纲取自尚硅谷的JUC视频 感兴趣的小伙伴可以去B站自学 JUC学习笔记及拓展 Java JUC 1 Java JUC简介 2 volatile 关键字 内存可见性 2 1 内存可见性 2 2 volat
  • Java面试题及答案整理汇总(2023最新版)

    前言 面试前还是很有必要针对性的刷一些题 很多朋友的实战能力很强 但是理论比较薄弱 面试前不做准备是很吃亏的 这里整理了很多面试常考的一些面试题 希望能帮助到你面试前的复习并且找到一个好的工作 也节省你在网上搜索资料的时间来学习 第1 10
  • QT多线程基础

    文章目录 简介 相关名词 QT 运行方式 基础使用方法 void QObject moveToThread QThread targetThread 退出线程过程 wait 等待子线程的结束 实例 QT锁QMutex QMutexLocke
  • Sentinel客户端调用并发控制

    前言 当链路中某个应用出现不稳定 导致整个链路调用变慢 如果不加控制可能导致雪崩 这种情况如何处理呢 一 慢调用现象分析 在分布式链路中调用中 调用关系如下 methodA1与methodA2在同一个应用中 链路标号 调用链 链路1 met
  • 测试开发工程师面试总结(一)——Java基础篇

    本文面向对象 测试开发工程师 服务端自动化方向 随手百度一下都能找到 岗位面试总结 但是有关测开岗位的面试总结却寥寥无几 总体原因可能是这两个 1 测试行业整体水平参差不齐 导致不同公司面试的问题不能抽象出来写概览 2 很多做测开的人可能内
  • CUDA编程问题记录:能否用CPU多线程调用CUDA核函数

    问题 能否在主机端创建CPU多线程 在每个线程里调用设备端核函数的caller函数 进而实现进一步的并行运行 例如有5张图片 对于每张图片都有N个GPU线程对其进行像素操作 但是此时是逐一对这5张图片处理的 想在主机端创建5个CPU线程 每
  • 抽象类和接口的区别,以及使用场景?

    抽象类 接口 抽象类和接口区别 Java 8中关于接口的改进 接口中的默认方法 抽象类和接口使用场景 抽象类是对一种事物的抽象 即对类抽象 而接口是对行为的抽象 抽象类是对整个类整体进行抽象 包括属性 行为 但是接口却是对类局部 行为 进行
  • 深入理解synchronized底层原理,一篇文章就够了!

    文章目录 前言 一 synchronized的特性 1 1 原子性 1 2 可见性 1 3 有序性 1 4 可重入性 二 synchronized的用法 三 synchronized锁的实现 3 1 同步方法 3 2 同步代码块 四 syn
  • 锁介绍名词解释&&Lock && synchronized

    各种锁名词解释及应用 一 名词解释 1 乐观锁 VS 悲观锁 2 自旋锁 VS 适应性自旋锁 3 无锁 VS 偏向锁 VS 轻量级锁 VS 重量级锁 4 公平锁 VS 非公平锁 5 可重入锁 VS 非可重入锁 6 独享锁 VS 共享锁 二
  • brpc源码解析(十七)—— bthread上的类futex同步组件butex详解

    文章目录 一 futex简介 二 butex源码解析 2 1 butex相关数据结构 2 2 butex主要机制 2 2 1 butex wait 2 2 2 butex wake 我们知道在linux 下 锁和其他一些同步机制都会用到fu
  • springboot自动装配原理

    目录 springboot自动装配详细原理 自动装配主要依靠三个核心的关键技术 引入starter 查找第三方配置类 动态加载 个人理解 还有不足的地方需要学习 写这篇帖子目的是为了记录自己的理解 springboot自动装配简单来说是sp

随机推荐

  • 最大连续子数组和

    最大连续子数组和 动态规划 迭代求出以i结尾的最大连续和 i 1结尾的最大连续和时和前一位的状态有关 列出递推式即可求解 class Solution public int FindGreatestSumOfSubArray vector
  • PHP多个三目运算符的坑

    废话不多说直接上代码 source gt item source self 自建 item source erp 精选 item source free 免费 大牌好货 有一天看到项目里面的代码 这样写的 多个三目运算符一起限定 项目一直在
  • ChatGPT将要颠覆的前十个行业

    ChatGPT将要颠覆的前十个行业 内容创作 ChatGPT可以生成高质量的文章 新闻和其他类型的文本内容 改变传统内容创作行业 在线客服 ChatGPT可以提供智能 高效的客户服务 改善用户体验 降低企业成本 教育领域 ChatGPT可作
  • react native 实现拖拽排序

    先上效果图 意思意思 其实原理很简单 没有想的那么难 大家在改造的时候 请注意 this offset 的值 因为它关系到查找目标box的index 原理 手势释放时 所在的坐标值来推算出目标box的Index 本文代码可读性还需要改造 代
  • assert函数_【C语言笔记】assert怎么用?

    一 什么是assert 编写代码时 我们总是会做出一些假设 断言 assert 就是用于在代码中捕捉这些假设 可以将断言看作是异常处理的一种高级形式 断言表示为一些布尔表达式 程序员相信在程序中的某个特定点该表达式值为真 可以在任何时候启用
  • 华为RH2288 V3服务器新加硬盘不识别

    华为服务器RH2288 V3原本6块本地硬盘配置RAID5 后新加入2块本地硬盘配置RAID RAID卡类型LSI SAS3108 时 不能被BIOS Configuration Utility界面VD Mgmt页签识别到处理方法 首先 检
  • 别收藏 Excel 函数大全了!北大硕博生为帮助女朋友,开发了个 ChatExcel,一键处理表格...

    整理 苏宓 出品 CSDN ID CSDNnews 众所周知 Excel 是一款应用广泛的办公软件 也是世界上使用最广泛语言的编程语言 还是一款优秀的低代码工具 然而 想要真正玩转它 不仅需要学会各种各样的 Excel 函数公式 也需要熟练
  • 解决SCP命令需要输入密码的问题

    需求 主机A ipA 文件复制到主机B ipB step1 主机A生成配对秘钥 在root目录下执行 ssh keygen t rsa step 2 将 ssh 目录中的 id rsa pub 文件复制到 主机B 的 ssh 目录中 并改名
  • 【蓝桥杯(51) STC15F2K60S2】之 “独立按键实验“

    相关代码 include STC15F2K60S2 H unsigned char KeyNumber unsigned char value unsigned char code SMG weixu 18 0xc0 0xf9 0xa4 0
  • [AI医学] llm-medical-data:用于大模型微调训练的医疗数据集

    关键词 医疗数据集 大模型微调训练 开源项目 llm medical data 用于大模型微调训练的医疗数据集 项目地址 https github com donote llm medical data 该项目主要参考了几篇关于医学领域大模
  • root用户登录tab有时无法补齐

    ubuntu bash 自动补齐 打开 bashrc把最后的注释 etc bash completion的三行打开 debian下增强bash的自动补全功能 根据zhllg的提示 在debian下增强了自动补齐功能 现在很多命令的参数也可以
  • Scrapy爬虫部署、相关api调用、以及gerapy的作用和使用流程总结

    scrapy部署介绍相关的中文文档地址 https scrapyd readthedocs io en latest 安装相关库 scrapyd 是运行scrapy爬虫的服务程序 它支持以http命令方式发布 删除 启动 停止爬虫程序 而且
  • 函数返回引用

    include
  • QString转Char*字符串

    QString转Char 字符串 在Qt下将QString转char 需要用到QByteArray类 因为char 最后都有一个 0 作为结束符 而采用QString toLatin1 时会在字符串后面加上 0 方法如下 int main
  • Hive聚合运算

    Hive聚合运算 Hive聚合运算 GROUP BY HAVING 基础聚合 高级聚合 Hive聚合运算 GROUP BY group by用于分组 Hive基本内置聚合函数与group by一起使用 如果没有指定group by子句 则默
  • P4047 [JSOI2010]部落划分

    题目链接 这道题一看最小值最大 很容易被误导进二分答案的思路 但实际上并不需要二分答案 其实正解是最小生成树 我们先预处理出原图的最小生成树 因为要分k个部落 所以我们先把最小的n k边先全部选走 因为我们用kruskal的话要用到并查集
  • QA工具开发流程

    前言 在项目上线前期 这边根据需求制作了一套QA测试工具 主要分为以下四个模块的测试 图1 数值测试 主要包括了角色的等级变更 游戏里货币的变更 目前已制作的 游戏道具的数量变更 这些可能归一为一类测试模型 动画测试 包括角色的控制系统的所
  • 直流电机驱动PWM频率(转)

    源 直流电机驱动PWM频率 1 没有统一的标准 其实PWM的频率和你的电机感抗和你需要的速度响应时间有很大的关系 一般的电机用14K就足够了 当然自需要简单的调速可以随便选 如果电机转速比较高 感抗比较小 可以使用比较高的频率 一般最好不要
  • 【详细】使用MkDocs搭建个人博客网站

    使用MkDocs搭建个人博客网站 0 安装python3 7 注意 可以在个人用户下安装 不要覆盖系统原有python 下载Python依赖环境 yum install gcc patch libffi devel python devel
  • 并发编程(线程)面试题总结2022

    目录 并发编程三要素是什么 在 Java 程序中怎么保证 多线程 的运行安全 什么是多线程 多线程的优劣 形成死锁的四个必要条件是什么 创建线程有哪几种方式 继承 Thread 类 实现 Runnable 接口 实现 Callable 接口