多线程面试梳理

【金三银四】多线程面试题(2021最新版) 目录 前言 1.多线程有什么用? 2.线程和进程的区别是什么? 3.Java 实现线程有哪几种方式? 4.启动线程方法 start()和 run()有什么区别? 5.怎么终止一个线程?如何优雅地终止线程? 6.一个线程的生命周期有哪几种状态?它们之间如何流转的? 7.线程中的 wait()和 sleep()方法有什么区别? 8.多线程同步有哪几种方法? 9.什么是死锁?如何避免死锁? 10.多线程之间如何进行通信? 11、线程怎样拿到返回结果? 12、violatile 关键字的作 阅读详情

(刚新建的群1039047324,欢迎对技术感兴趣的朋友加入,群内可以接私活,聊技术,分享工作中容易踩的坑,以及如何避免踩坑)

对于新手来说,掌握的多线程知识可能仅限于多线程的几种实现方式,线程的几种状态,以及wait,notify的简单用法。这如果面试的话必死无疑。

接下来整理一下多线程面试题,以及最重要的细节。


1、并发编程三要素,有点像数据库事务的ACID。
1)原子性
原子性指的是一个或者多个操作,要么全部执行并且在执行的过程中不被其他操作打断,要么就全部都不执行。

Java内存模型只保证了基本读取和赋值是原子性操作,如果要实现更大范围操作的原子性,可以通过synchronized和Lock,以及Atomic来实现。
请分析以下哪些操作是原子性操作:

1

2

3

4

x = 10;         //语句1

y = x;         //语句2

x++;           //语句3

x = x + 1;     //语句4

咋一看,有些朋友可能会说上面的4个语句中的操作都是原子性操作。其实只有语句1是原子性操作,其他三个语句都不是原子性操作。
语句1是直接将数值10赋值给x,也就是说线程执行这个语句的会直接将数值10写入到工作内存中。
语句2实际上包含2个操作,它先要去读取x的值,再将x的值写入工作内存,虽然读取x的值以及 将x的值写入工作内存 这2个操作都是原子性操作,但是合起来就不是原子性操作了。

2)可见性
可见性指多个线程操作一个共享变量时,其中一个线程对变量进行修改后,其他线程可以立即看到修改的结果。
3)有序性
有序性,即程序的执行顺序按照代码的先后顺序来执行。

一般来说,处理器为了提高程序运行效率,可能会对输入代码进行优化,它不保证程序中各个语句的执行先后顺序同代码中的顺序一致,但是它会保证程序最终执行结果和代码顺序执行的结果是一致的。指令重排序不会影响单个线程的执行,但是会影响到线程并发执行的正确性。也就是说,要想并发程序正确地执行,必须要保证原子性、可见性以及有序性。只要有一个没有被保证,就有可能会导致程序运行不正确。

2、实现可见性的方法有哪些
synchronized或者Lock:保证同一个时刻只有一个线程获取锁执行代码,锁释放之前把最新的值刷新到主内存,实现可见性。
注意:加锁的含义不仅是局限于互斥行为,还包括内存可见性,为了确保所有线程都能看到共享变量的最新值,所有执行读写操作的线程都要在同一个锁上同步。
java提供了一种轻量级的同步,就是volatile变量,用来确保将变量的更新操作通知都其他线程。
volatile变量的正确使用场景包括:确保它们自身状态的可见性,确保它们所引用对象的状态的可见性,以及标识一些重要的程序生命周期事件的发生。对于一些需要先检查后执行的操作,可以使用volatile。
volatile关键字保证了操作的可见性,但是volatile能保证对变量的操作是原子性吗

使用volatile必须具备以下2个条件:
           1)对变量的写操作不依赖于当前值
           2)该变量没有包含在具有其他变量的不变式中

3、创建线程的有哪些方式?
1)继承Thread类创建线程类
2)通过Runnable接口创建线程类
3)通过Callable和Future创建线程
4)通过线程池创建


4、创建线程的三种方式的对比?
1)采用实现Runnable、Callable接口的方式创建多线程。
优势是:
线程类只是实现了Runnable接口或Callable接口,还可以继承其他类。
在这种方式下,多个线程可以共享同一个target对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU、代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。
劣势是:
编程稍微复杂,如果要访问当前线程,则必须使用Thread.currentThread()方法。
2)使用继承Thread类的方式创建多线程
优势是:
编写简单,如果需要访问当前线程,则无需使用Thread.currentThread()方法,直接使用this即可获得当前线程。
劣势是:
线程类已经继承了Thread类,所以不能再继承其他父类。
3)Runnable和Callable的区别
Callable规定(重写)的方法是call(),Runnable规定(重写)的方法是run()。
Callable的任务执行后可返回值,而Runnable的任务是不能返回值的。
Call方法可以抛出异常,run方法不可以。
运行Callable任务可以拿到一个Future对象,表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。通过Future对象可以了解任务执行情况,可取消任务的执行,还可获取执行结果。

那么这个组合的使用有什么好处呢?假设有一个很耗时的返回值需要计算,并且这个返回值不是立刻需要的话,那么就可以使用这个组合,用另一个线程去计算返回值,而当前线程在使用这个返回值之前可以做其它的操作,等到需要这个返回值时,再通过Future得到

public class CallableAndFuture {
    public static void main(String[] args) {
        ExecutorService threadPool = Executors.newSingleThreadExecutor();
        Future<Integer> future = threadPool.submit(new Callable<Integer>() {
            public Integer call() throws Exception {
                return new Random().nextInt(100);
            }
        });
        try {
            Thread.sleep(5000);// 可能做一些事情
            System.out.println(future.get());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}
 

5、Java线程具有五种基本状态
1)新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread();
2)就绪状态(Runnable):当调用线程对象的start()方法(t.start();),线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,并不是说执行了t.start()此线程立即就会执行;
3)运行状态(Running):当CPU开始调度处于就绪状态的线程时,此时线程才得以真正执行,即进入到运行状态。注:就
绪状态是进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中;
4)阻塞状态(Blocked):处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才 有机会再次被CPU调用以进入到运行状态。
根据阻塞产生的原因不同,阻塞状态又可以分为三种:
a.等待阻塞:运行状态中的线程执行wait()方法,使本线程进入到等待阻塞状态;
b.同步阻塞 – 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态;
c.其他阻塞 – 通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
5)死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

6、什么是线程池
线程池就是提前创建若干个线程,如果有任务需要处理,线程池里的线程就会处理任务,处理完之后线程并不会被销毁,而是等待下一个任务。由于创建和销毁线程都是消耗系统资源的,所以当你想要频繁的创建和销毁线程的时候就可以考虑使用线程池来提升系统的性能。
java 提供了一个 java.util.concurrent.Executor接口的实现用于创建线程池。
7、线程池有哪几种创建方式
1)newCachedThreadPool创建一个可缓存线程池
2)newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数。
3)newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
4)newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务。
8、线程池的优点
1)重用存在的线程,减少对象创建销毁的开销。
2)可有效的控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。
3)提供定时执行、定期执行、单线程、并发数控制等功能。

9、常用的并发工具类有哪些?
CountDownLatch
CyclicBarrier
Semaphore
Exchanger

10 为什么wait()和notify()不属于Thread,却属于Object类
wait()暂停的是持有锁的对象,所以想调用wait()必须为:对象.wait();notify()唤醒的是等待锁的对象,调用:对象.notify();
注意:wait(),notify(),notifyAll()都必须使用在同步中,因为要对持有监视器(锁)的线程操作。所以要使用在同步中,因为只有同步 才具有锁。
为什么这些操作线程的方法要定义在object类中呢?
简单说:因为synchronized中的这把锁可以是任意对象,所以任意对象都可以调用wait()和notify();所以wait和notify属于Object。
专业说:因为这些方法在操作同步线程时,都必须要标识它们操作线程的锁,只有同一个锁上的被等待线程,可以被同一个锁上的notify唤醒,不可以对不同锁中的线程进行唤醒。
也就是说,等待和唤醒必须是同一个锁。而锁可以是任意对象,所以可以被任意对象调用的方法是定义在object类中。
在jdk1.5以后,将同步synchronized替换成了Lock,将同步锁对象换成了Condition对象,并且Condition对象可以有多个。
Condition中的await(), signal().signalAll()代替Object中的wait(),notify(),notifyAll(),这样做的好处,我们可以指定唤醒某一方,减少消耗.

private Lock lock = new ReentrantLock();

private Condition condition_pro = lock.newCondition();//生产者对象

private Condition condition_con = lock.newCondition();//消费者对象

public void set(String name) throws Exception{

lock.lock();//加锁

try{

while(flag){

contion_pro.await();

Sytem.out.printLn("生产者");

   flag= true;

condition_con.singal();//指定唤醒消费方

}finally{

lock.unlock();//解锁

}

}

}

public void out() throws Exception{

lock.lock();

try{

while(!flag){

condition_con.await();

Sytem.out.printLn("消费者");

flag = false;

condition_pro.signal();//指定唤醒生产方

}finally{

lock.unlock();

}

}

}
 

11、什么是CAS
CAS是compare and swap的缩写,即我们所说的比较交换。
cas是一种基于锁的操作,而且是乐观锁。在java中锁分为乐观锁和悲观锁。悲观锁是将资源锁住,等一个之前获得锁的线程释放锁之后,下一个线程才可以访问。而乐观锁采取了一种宽泛的态度,通过某种方式不加锁来处理资源,比如通过给记录加version来获取数据,性能较悲观锁有很大的提高。
CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)

和新值(B)。如果内存地址里面的值和A的值是一样的,那么就将内存里面的值更新成B。CAS是通过无限循环来获取数据的,若果在第一轮循环中,a线程获取地址里面的值被b线程修改了,那么a线程需要自旋,到下次循环才有可能机会执行。
java.util.concurrent.atomic 包下的类大多是使用CAS操作来实现的( AtomicInteger,AtomicBoolean,AtomicLong)。 

12、CAS的问题
1)CAS容易造成ABA问题
一个线程a将数值改成了b,接着又改成了a,此时CAS认为是没有变化,其实是已经变化过了,而这个问题的解决方案可以使用版本号标识,每操作一次version加1。在java5中,已经提供了AtomicStampedReference来解决问题。
2) 不能保证代码块的原子性
CAS机制所保证的只是一个变量的原子性操作,而不能保证整个代码块的原子性。比如需要保证3个变量共同进行原子性的更新,就不得不使用synchronized了。
3)CAS造成CPU利用率增加
之前说过了CAS里面是一个循环判断的过程,如果线程一直没有获取到状态,cpu资源会一直被占用。 

13、什么是AQS
AQS是AbustactQueuedSynchronizer的简称,它是一个Java提高的底层同步工具类,用一个int类型的变量表示同步状态,并提供了一系列的CAS操作来管理这个同步状态。
AQS是一个用来构建锁和同步器的框架,使用AQS能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的ReentrantLock,Semaphore,其他的诸如ReentrantReadWriteLock,SynchronousQueue,FutureTask等等皆是基于AQS的。

重入锁的实现,就是
1、使用 CAS 对 原子state 进行操作,再根据操作的结果来进行资源控制,且当获取资源失败后,
2、使用 On Sync Queue 来进行阻塞等待排队,并等待唤醒以便进行再次对 原子state 进行 CAS 操作来尝试获取资源
的这么一个反复循环的过程。

 


14、AQS支持两种同步方式:
1)独占式
2)共享式
这样方便使用者实现不同类型的同步组件,独占式如ReentrantLock(可重入锁),共享式如Semaphore,CountDownLatch,组合式的如ReentrantReadWriteLock。总之,AQS为使用提供了底层支撑,如何组装实现,使用者可以自由发挥。

可重入:
如果你了解过synchronized关键字,一定知道他的可重入性,可重入就是同一个线程可以重复加锁,每次加锁的时候count值加1,每次释放锁的时候count减1,直到count为0,其他的线程才可以再次获取。

 

15、ReadWriteLock是什么
首先明确一下,不是说ReentrantLock不好,只是ReentrantLock某些时候有局限。如果使用ReentrantLock,可能本身是为了防止线程A在写数据、线程B在读数据造成的数据不一致,但这样,如果线程C在读数据、线程D也在读数据,读数据是不会改变数据的,没有必要加锁,但是还是加锁了,降低了程序的性能。
因为这个,才诞生了读写锁ReadWriteLock。ReadWriteLock是一个读写锁接口,ReentrantReadWriteLock是ReadWriteLock接口的一个具体实现,实现了读写的分离,读锁是共享的,写锁是独占的,读和读之间不会互斥,读和写、写和读、写和写之间才会互斥,提升了读写的性能。

线程写数据的时候加锁是为了确保数据的准确性,但是线程读数据的时候再加锁就会大大降低效率,这时候怎么办呢?那就对写数据和读数据分开,加上两把不同的锁,不仅保证了正确性,还能提高效率。

我们只需要保证读锁和写锁来自同一个 ReentrantReadWriteLock 即可
可以锁降级
线程获取写入锁后可以获取读取锁,然后释放写入锁,这样就从写入锁变成了读取锁,从而实现锁降级的特性。

不可锁升级
线程获取读锁是不能直接升级为写入锁的。需要释放所有读取锁,才可获取写锁。


private ReadWriteLock lock = new ReentrantReadWriteLock();//定义读写锁
//根据 key 获取 value 值
public Object getValue(String key){
    //使用读写锁的基本结构
    lock.readLock().lock();//加读锁
    Object value = null;
    try{
        value = cache.get(key);
        if(value == null){
            lock.readLock().unlock();//value值为空,释放读锁
            lock.writeLock().lock();//加写锁,写入value值
            try{
                //重新检查 value值是否已经被其他线程写入
                if(value == null){
                    value = "value";//写入数据
                }
            }finally{
                lock.writeLock().unlock();
            }
            lock.readLock().lock();
        }
    }finally{
        lock.readLock().unlock();
    }
    return value;
}

16、sleep方法和wait方法有什么区别
这个问题常问,sleep方法和wait方法都可以用来放弃CPU一定的时间,不同点在于如果线程持有某个对象的监视器,sleep方法不会放弃这个对象的监视器,wait方法会放弃这个对象的监视器

17、Java死锁以及如何避免
Java中的死锁是一种编程情况,其中两个或多个线程被永久阻塞,Java死锁情况出现至少两个线程和两个或更多资源。
Java发生死锁的根本原因是:在申请锁时发生了交叉闭环申请。

1)是多个线程涉及到多个锁,这些锁存在着交叉,所以可能会导致了一个锁依赖的闭环。
例如:线程在获得了锁A并且没有释放的情况下去申请锁B,这时,另一个线程已经获得了锁B,在释放锁B之前又要先获得锁A,因此闭环发生,陷入死锁循环。
2)默认的锁申请操作是阻塞的。
所以要避免死锁,就要在一遇到多个对象锁交叉的情况,就要仔细审查这几个对象的类中的所有方法,是否存在着导致锁依赖的环路的可能性。总之是尽量避免在一个同步方法中调用其它对象的延时方法和同步方法。

18、如果你提交任务时,线程池队列已满,这时会发生什么
这里区分一下:
1)如果使用的是无界队列LinkedBlockingQueue,也就是无界队列的话,没关系,继续添加任务到阻塞队列中等待执行,因为LinkedBlockingQueue可以近乎认为是一个无穷大的队列,可以无限存放任务
2)如果使用的是有界队列比如ArrayBlockingQueue,任务首先会被添加到ArrayBlockingQueue中,ArrayBlockingQueue满了,会根据maximumPoolSize的值增加线程数量,如果增加了线程数量还是处理不过来,ArrayBlockingQueue继续满,那么则会使用拒绝策略RejectedExecutionHandler处理满了的任务,默认是AbortPolicy

 19、Semaphore有什么作用
Semaphore就是一个信号量,它的作用是限制某段代码块的并发数。Semaphore有一个构造函数,可以传入一个int型整数n,表示某段代码最多只有n个线程可以访问,如果超出了n,那么请等待,等到某个线程执行完毕这段代码块,下一个线程再进入。由此可以看出如果Semaphore构造函数中传入的int型整数n=1,相当于变成了一个synchronized了。

Semaphore(信号量),叫许可证可能更好理解,用于做限流处理,比如说同时只允许5五个人访问,超过五个人访问就需要等待,类似这样的需求,下面的案例可以看出执行是五个五个的执行,等上一个五个执行完了,才会执行下一个


        // 线程池  
        ExecutorService exec = Executors.newCachedThreadPool();
        // 只能5个线程同时访问  
        final Semaphore semp = new Semaphore(5);
        // 模拟20个客户端访问  
        for (int index = 0; index < 20; index++) {
            final int NO = index;
            Runnable run = new Runnable() {
                public void run() {
                    try {
                        // 获取许可  
                        semp.acquire();
                        System.out.println("Accessing: " + NO);
                        //模拟实际业务逻辑
                        Thread.sleep((long) (Math.random() * 10000));
                        // 访问完后,释放  
                        semp.release();
                    } catch (InterruptedException e) {
                    }
                }
            };
            exec.execute(run);
        }
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //System.out.println(semp.getQueueLength());
        // 退出线程池
        exec.shutdown();
   
 

Java多线程并发面试知识点梳理 1. 什么是线程、进程? 进程是程序执行的过程,是系统运行程序的基本单位。(时间片轮询) 线程是轻量级的进程,同类的多个线程共享进程的堆、方法区的资源,拥有独立的虚拟机栈、本地方法栈和程序计数器。例如java中main函数启动,就是启动了一个线程。 2.为什么要用多线程? 目的是为了提高CPU利用率。从计算机底层来说线程是程序执行的最小单位,线程间切换和调度的成本远远小于进程。从互联网发展趋势来讲... 阅读详情

相关推荐

面试题 2.实现多线程的方法有哪几种?

2.实现多线程的方法有哪几种? 答:JVM允许程序并发的运行多个线程,Java中,多线程的实现一般有三种方法: 1.实现Runable接口,并且实现该接口的run()方法 执行start()的顺序不代表线程执行的顺序 2.继承Thread类,重写run()方法 3.实现Callable接口,重写call方法(提供返回值,可以抛出异常) 一般推荐使用Runable方式,因为只有run()方...

JAVA求生之路——博主406766467 610

多线程面试题总结(高级篇,2021-02-19)

一、ThreadLocal 是什么?有哪些使用场景? ThreadLocal 是一个本地线程副本变量工具类,在每个线程中都创建了一个 ThreadLocalMap 对象,简单说 ThreadLocal 就是一种以空间换时间的做法,每个线程可以访问自己内部 ThreadLocalMap 对象内的 value。通过这种方式,避免资源在多线程间共享。 原理:线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享。Java提供ThreadLocal类来支持线程局部变量,是一种实现线程安全的方式

学Java,找哪吒 1万+

数字IC笔记-低功耗技术

传统的降低Power的方法主要有: 1.门控时钟技术(clock gating) 2.多阈值电压技术(MultiShreshold) 3.动态电压频率调节技术(DVFS) 目前有以下几种低功耗技术: 1.多电压技术(Multi-Voltage) 2.MTCOMS Power Gating 技术(多阈值功耗控制技术),比如基带部分中的2G、3G、CDMA、LTE等通过awake—>sleep—>awake的方式间歇式的打开或关断其电源,power gating 可以完全关掉dynamic的pow

sinat_41774721的博客 1933

几率大的多线程面试题(含答案)

其他篇章:Java校招极大几率出的面试题(含答案)----汇总 本文面试题如下: 线程和进程的区别? Thread和Runnable的关系,区别 synchronized底层如何实现?锁优化,怎么优化?多线程中 synchronized 锁升级的原理是什么? Synchronized和Lock的区别? synchronized和ReentrantLock有什么区别呢? 使用场景 线程池的工作原理,...

睶 3万+

UMI刷盘机器人代码实战:从SLAM到Diffusion Policy的完整部署流程

本文详细解析了UMI(Universal Manipulation Interface)刷盘机器人从数据准备到真实部署的完整实战流程。通过SLAM处理视频数据生成三维轨迹,并训练Diffusion Policy模型,最终将策略部署到UR5机械臂与WSG50夹爪上,实现从模仿学习到物理执行的闭环。

weixin_29042035的博客 462

Keil5实战:如何高效导出变量数据并实现可视化分析

本文详细介绍了在Keil5开发环境中,如何利用调试脚本高效导出程序运行时变量数据的方法。通过编写脚本自动捕获数据并保存为文件,再结合Excel或Python进行可视化分析,为嵌入式调试与算法优化提供了数据支撑,显著提升开发效率。

silver的专栏 1106

Java多线程面试知识点汇总(超详细总结)

一、sleep()方法、wait()方法、yeild()方法、interrupt()方法、notify()、notifyAll()方法 1、sleep()方法: sleep方法为Thread的静态方法; sleep方法的作用是让线程休眠指定时间,在时间到达时自动恢复线程的执行; sleep方法不会释放线程锁; 2、wait()方法: wait方法是Object的方法; 任意一个对象都...

hp_yangpeng的博客 1万+

动力锂电池-二阶RC模型等效电路-RLS参数辨识-Simulink

1.锂电池二阶RC等效电路模型

QQ1978009424的博客 1万+

Java面试集锦:25道线程类相关面试题与答案(二)

Java面试集锦:25道线程类相关面试题与答案(二) .png接Java面试集锦:25道线程类相关面试题与答案(一)26. 并发编程三要素? 1)原子性2)可见性3)有序...

Coder编程的博客 899

【vsomeip3 教程】基于 vSomeIP 3.5 的路由域实践:从配置到运行状态的完整指南

___ > 前言(读者定位与准备) 目标读者:在 Linux 上做分布式/车载中间件通信的 C++ 工程师。 > 先决条件:CMake、Boost 基础;理解 TCP/UDP 与多进程通信。 > 文中术语:Routing Host(路由进程)、Application、Service/Instance、Method、Event/EventGroup、SOME/IP-SD。 > 演示环境:单机多进程 & 跨主机两套对照。

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 1160

生产环境中redis的SCAN命令如何替代KEYS命令?

本文介绍了使用SCAN命令替代KEYS的完整方案。SCAN通过游标分批迭代,避免KEYS命令遍历整个键空间导致的阻塞风险。文章详细说明了SCAN的基础语法、迭代流程和Java实现示例,强调必须关闭Cursor避免连接泄漏。针对生产环境,提供了COUNT参数调优、客户端去重、集群模式适配等优化建议,并列举了典型错误场景。SCAN通过分批次迭代和游标管理,可安全实现高性能键空间遍历。全文150字。

DN金猿的博客 179

deepseek梳理java高级开发工程师多线程面试题

以上内容涵盖了Java多线程的核心知识点,建议结合具体项目经验准备实际案例。对于高级岗位,面试官通常会深入追问实现细节和性能优化方面的实践。

fw150104010012的博客 486

手把手教你用 Cursor 写一个完整的 Web 应用(含前后端 + 部署)

本文介绍如何利用Cursor AI工具从零开发一个完整的全栈待办事项Web应用。文章针对开发者常见痛点——无法独立完成项目闭环,提供了一套AI驱动的全栈开发范式。通过Vue3+Node.js+MySQL技术栈,全程由Cursor自动生成项目架构、前后端代码、数据库设计,并解决联调、部署等关键问题。重点展示了如何用AI完成:项目规划与架构设计、后端接口开发、前端页面实现、跨域联调、打包优化及云端部署全流程。该方法将传统需要3-5天的开发工作压缩至1小时内完成,产出规范可上线的项目,特别适合想突破"碎

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 641

deepseek梳理java高级开发工程师多线程面试题——进阶版

【代码】deepseek梳理java高级开发工程师多线程面试题——进阶版。

fw150104010012的博客 271

DNA图谱分析:自动分析DNA图谱中的变异YOLOv5、YOLOv8、YOLOv10

YOLO(You Only Look Once)是一种基于卷积神经网络(CNN)的目标检测模型,因其高效的检测速度和优异的精度而广泛应用于计算机视觉任务。一次性检测:与传统的目标检测方法不同,YOLO通过回归方法同时预测多个边界框和类别信息,从而实现高效的目标检测。高精度与高速度:YOLO在检测精度和速度之间找到了平衡,适用于实时目标检测任务。

YOLO 733

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

搞定Java多线程:多线程面试问题梳理

1、 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速。比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒。Java多线程充分发挥了计算机多核CPU的优势。 2、线程和进程有什么区别? 线程是进程的子集,一个进程可以有很多线程,每条线程并行执...

编程者说的博客专栏 2115

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

面试知识点梳理及相关面试题(五)-- 多线程

1.进程、线程和协程 进程: 一个运行的程序就是一个进程 进程是资源分配的最小单位 线程: 程序中运行的一个个子任务就是一个线程 线程是操作系统调度执行的最小单位 协程: 协程是一种用户态的轻量级线程,协程的调度完全由用户控制。 2.创建线程的四种方式: 继承Thread类 实现Runnable方法 实现Callable方法(有返回值),call方法启动 使用线程池创建 使用Runnable相比Thread的好处: 继承只能是单继承,具有局限性 Callable和Runnable的

weixin_39724194的博客 716

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Java面试题:Java多线程与并发面试题解析及知识梳理,Java中的线程池(ThreadPool)以及其重要性

核心内容:Java内存模型(JMM)是Java虚拟机(JVM)的一部分,它定义了Java程序中各种变量(线程共享的变量)的访问规则,保证了不同线程之间的可见性和有序性。编程实操:在多线程环境下,当一个线程修改了共享变量的值,其他线程能够立即看到修改后的值,同时避免因为指令重排序导致的问题。编程实操:使用Java中的Executor框架,根据实际需求选择合适的线程池实现,如固定线程池、单线程池、优先级线程池等。核心内容:线程池是一种用于执行多线程任务的管理器,它能够有效地管理线程的生命周期,提高系统性能。

码农超哥的博客 544

45天拿下字节跳动Android研发岗offer,竟然有个面试真题库,内幕首次公开!

字节跳动哇,想想今日头条、抖音、悟空问答、西瓜视频 、火山小视频、 图虫、花熊等等,这些都是字节跳动旗下的APP我,我想去,那我得好好问问,学一学经验(抱大腿),万一我可以去现场学习呢!还好,大佬人还是挺nice的,给了我一个名额,现在讲讲我三面时的情况。

2401_87029852的博客 996

Java面试题:深度解析设计模式、内存模型、多线程与并发框架有关面试题的综合应用,必知必会Java知识点梳理

通过本文的探讨,我们不仅解答了一道综合性的面试题,更重要的是,我们学习了如何在实际开发中应用设计模式、内存模型、多线程和并发框架。这些知识点的掌握,将极大地提升你作为Java开发者的专业素养,帮助你构建出更加健壮、高效的系统。记住,理论知识与实践操作相结合,才能发挥出最大的技术价值。

码农超哥的博客 1007

我凭借这份“2021全网最全Java面试清单”彻底征服阿里面试官

前言 今年的大环境非常差,互联网企业裁员的现象比往年更严重了,可今年刚好是我的第一个“五年计划”截止的时间点,说什么也不能够耽搁了,所以早早准备的跳槽也在疫情好转之后开始进行了。但是,不得不说,这次阿里面试真的太难为我了,可以说是和面试官大战了7个回合,不过好在最后给了offer。 我个人情况是5年Java后台经验,阿里定级P7的样子,下面是我的面试经历分享,希望能带来一些不一样的启发和帮助。 我与阿里面试官“大战”7回合,胜 第一轮: 第一轮面试是电话面,以基础知识为主,前后大概2个.

Java6888的博客 242

android面试题!Android多线程实现方式及并发与同步,学习路线+知识点梳理

前言 今年的寒来得格外慢,眼看年关将近,开年就入春了,但西北季风似乎没有往年的无情。 天气和互联网行业的双重寒冷险些让我翻不过身。 那时的我正处在一个尴尬的境地,工作两年,压力不大,朝九晚五,做着一些在刚入职就一直在做的增删改查。 曾经也找过一些书,一些视频,告诉自己,认真学一学,不然以后的路会越来越难走。但我发现自己已经不是那个在高中孤注一掷为考上大学努力学习的热血少年了。我曾以为自己的实力虽然不济,但认真复习一下找个工作应该不会太困难。好吧,现实狠狠地打了我的脸,年初面试的不断失利,让我明白了自己的不

chayel123的博客 438

火爆Github!阿里高工熬夜15天码出Java160K字面试宝典 (全是重点)

Java面试 大家都知道,现在的Java面试是越来越难了!主要原因无非是两个: 随着Java这个行业的兴起,不管是在家待业的、对自己现在工作不满意的、大学选错专业的、缺钱的、想自己学的等等这些人绝大部分都是选择了去学习Java!大量人才涌入,导致岗位竞争越来越大,面试也就越来越难! 另外一个就是这两年的疫情影响,很多公司都宣布倒闭、裁员。加上互联网行业内卷的推动,面试造火箭工作拧螺丝已经是一个很常见的现象了! 最近也是一直有粉丝朋友私信我说,金三银四都快结束了,LZ有没有一份内容全面,题目高频的面试题

Java6888的博客 203

大意了,备战字节面试半年,因为这个功亏一篑

实际上,梳理知识体系是最简单的事,但很多开发小白总是一头雾水,实际上从第二点的大厂面试点就可以总结梳理出来我们应该要学什么,要掌握什么,通常我的方法是“大厂面试点”+“工作年限”来梳理自己接下来的学习及发展路线图。本文限于篇幅,故而只展示部分的文档截图,完整的Java学习文档我已经帮你们整理好了,有需要的朋友文末有领取方式!之后,就需要根据路线图上的重点去进行有针对性的学习,在学习过程中,学会举一反三,学会写笔记,做总结。回答过程中,太过自卑,导致前言不搭后语,恶性循环。SpringCloud 篇。

2501_90433232的博客 434

这五十道多线程的面试题,学会了,带你驰骋大厂!

面试中的各位或者已经面试过的各位多多少少都会遇到过面试官问你多线程与高并发的问题,你想逃都逃不掉。面试的时候果然是,还好自己刷题比较多,这也验证了一个说法,大家在面试字节等目前比较火的互联网公司,一定要记得多刷题,文末会有自己面试的时候准备好的面试题PDF文档,有注意各位查漏补缺,有需要的可以找我免费获取到,这次面试的答案我也已经整理出来了,文末会有获取方式! 具体的面试题,大家看正文吧! 很多人拥有大厂梦,却因为多线程与高并发败下阵来。实际上,多线程与高并发并不难,今天这份最全的多线程与高并发总结,助你

maxiao112的博客 525

iOS,面试必看,最全梳理

序言目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了。今年,找过工作人可能会更深刻地体会到今年的就业形势不容乐观,加之,培训机构一火车地向用人单位输送iOS开发人员,打破了生态圈的动态平衡。矫情一下,言归正传,我奉献一下,为iOS应聘者梳理一下面试题,希望能助一臂之力!OC的理解与特性 OC作为一门面向对象的语言,自然具有面向对象的语言特性:封装、继承、多态。它既具有静态语言的特性(如

Jacklin 1449
上一篇: Redis面试内容梳理
下一篇: 消息队列面试总结
微服务架构
博客等级 码龄10年 15粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值