Q1.创建线程有哪几种方式? 继承Thread类并实现run方法,调用继承类的start方法开启线程; 通过实现Runnable接口,重写run方法,调用线程对象的start方法开启线程; 通过实现Callable接口,实现call方法,并用FutureTask类包装Callable对象开启线程。Q2.sleep() 和 wait() 有什么区别? sleep后程序不会释放同步锁,wait后程序会释放同步锁 sleep可以指定睡眠时间,自动唤醒,wait可以直接用notify唤醒 sleep的类是Thread,wait的类是ObjectQ3.synchronized 和 volatile 的区别是什么? volatile本质是在告诉vm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取; synchronize则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞。 volatile仅能实现变量的修改可见性,不能保证原子性;synchronize可以保证变量的修改可见性和原子性。 volatile不会造成线程的阻塞;synchronize可能会造成线程的阻塞。 volatile标记的变量不会被编译器优化,synchronize标记的变量可以被编译器优化Q4.synchronized 和 Lock 有什么区别? synchronized是关键字,属于jvm层面;Lock是具体类,是api层面的锁; synchronized无法获取锁的状态,Lock可以判断; synchronized用于少量同步,Lock用于大量同步。Q5.乐观锁和悲观锁 乐观锁:认为每次去拿数据的时候别人不会修改,所以不会上锁,但是每次要提交数据的时候都会先判断数据是否被别人修改 悲观锁:认为每次去拿数据的时候别人都会修改,所以每次都会上锁。 使用场景:乐观锁使用于多读少写的应用类型,这样可以提高吞吐量;相反的情况则使用悲观锁Q6.tcp 为什么要三次握手,两次不行吗?为什么? 两次握手只能保证单向连接是畅通的。 只有经过第三次握手,才能确保双向都可以收到对方发送的数据❤【拼多多2025届技术校招】全面启动,6大岗位(base上海),总有一个适合你!📣海量HC,线上笔面试,流程超快;越早投递简历机会越多,快来pick你的offer吧!📣【网申链接】:https://careers.pinduoduo.com/campus/grad/technical-session📣【内推链接】:https://careers.pinduoduo.com/campus/grad?t=iDsAO7bjl4,内推码:iDsAO7bjl4