【JAVA经典面试题】每日一刷

Q1.创建线程有哪几种方式?
    继承Thread类并实现run方法,调用继承类的start方法开启线程;
    通过实现Runnable接口,重写run方法,调用线程对象的start方法开启线程;
    通过实现Callable接口,实现call方法,并用FutureTask类包装Callable对象开启线程。

Q2.sleep() 和 wait() 有什么区别?
    sleep后程序不会释放同步锁,wait后程序会释放同步锁
    sleep可以指定睡眠时间,自动唤醒,wait可以直接用notify唤醒
    sleep的类是Thread,wait的类是Object

Q3.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
全部评论

相关推荐

评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务