每日后端面试5题 第三天

这篇具有很好参考价值的文章主要介绍了每日后端面试5题 第三天。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  1.  线程有哪几种状态以及各种状态之间的转换?(必会)

看图:

每日后端面试5题 第三天,java,开发语言,面试
图片来自 线程状态转换图及其5种状态切换_小曹的blog的博客-CSDN博客
每日后端面试5题 第三天,java,开发语言,面试
图片来自 总算把线程六种状态的转换说清楚了! - 知乎

线程一共有4种状态,分别是:

1.创建/新生状态new:被new出来了,还没start()。

2.就绪状态runable:start()了,待会去抢cpu。

  抢到了cpu就是传说中的第五种状态运行状态running。(说好的5种呢)

  这第六种的运行状态,运行的就是run()中的代码。

3.阻塞状态:运行run运行到一半,脾气一耍,不运行了,等条件蛮足了心情好了再运行。

   有三种情况:

1)等待waiting:玩wait()玩的

2)计时等待time waiting: sleep() 或 join()或发出了 I/O 请求搞的。

3)阻塞blocked:被synchronized锁了

4.死亡状态terminated:run里面代码跑完了,就死了

补充:start和run方法的区别

1.类型上,start是同步方法,run是非同步方法。 

2.作用上,run方法存放任务代码,start方法启动线程线程

3.对线程数量的影响方面,run不会产生新线程,start会产生新线程

4.调用次数方面,run方法可以被执行无数次,而star方法只能被执行一次,因为线程不能被重复启动

结合2、3点作用可以回答:

再补充:简述在main方法中运行线程的start方法和run方法,有什么区别,请看题:

class MyThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName() + " " + i);
        }
    }
}

public class TestThread {
    public static void main(String[] args) {
        Thread t0 = new MyThread();
        Thread t1 = new MyThread();

        Thread t2 = new MyThread();
        Thread t3 = new MyThread();

        t0.start();
        t1.start();

        System.out.println("=================================");

        t2.run();
        t3.run();
    }
}

以上代码的运行结果是什么样的?

A.

thread-0 0 // t0启动
thread-0 1
thread-0 2
thread-1 0 // t1启动
thread-1 1
... // t0和t1交替运行,打印0到99
thread-0 99
thread-1 99
=================================
thread-2 0 // t2.run()启动
thread-2 1
thread-3 0 // t3.run()启动
thread-3 1
... // t2run和t3run交替运行,打印0到99
thread-3 99
thread-2 99

 B.

=================================
thread-0 0 // t0启动
thread-0 1
thread-0 2
thread-1 0 // t1启动
thread-1 1
main 0 // t2.run()启动
main 1
... // t0、t1和t2run交替运行,打印0到99
thread-0 99
thread-1 99
main 99
main 0 // t3.run()启动
main 1
... // t3run运行,打印0到99
main 99

 C.

thread-0 0 // t0启动
thread-0 1
thread-0 2
thread-1 0 // t1启动
thread-1 1
... // t0和t1交替运行,打印0到99
thread-0 99
thread-1 99
=================================
main 0 // t2.run()启动
main 1
... // t2run运行,打印0到99
main 99
main 0 // t3.run()启动
main 1
... // t3run运行,打印0到99
main 99

D.

=================================
thread-0 0 // t0启动
thread-0 1
thread-0 2
thread-1 0 // t1启动
thread-1 1
main 0 // t2.run()启动
main 1
main 0 // t3.run()启动
main 1
... // t0、t1和t2run、t3run交替运行,打印0到99
thread-1 99
main 99
main 99
thread-0 99

 答案是B。原因需要结合上面的2、3点来理解。

2.作用上,run方法存放任务代码,start方法启动线程线程

3.对线程数量的影响方面,run不会产生新线程,start会产生新线程

再再补充:变种题

class MyThread extends Thread {
    @Override
    public void run() {
        synchronized (this) {  // 注意这里加了个线程锁
            for (int i = 0; i < 100; i++) {
                System.out.println(Thread.currentThread().getName() + " " + i);
            }
        }
    }
}

public class TestThread {
    public static void main(String[] args) {
        Thread t0 = new MyThread();
        Thread t1 = new MyThread();

        Thread t2 = new MyThread();
        Thread t3 = new MyThread();

        t0.start();
        t1.start();

        System.out.println("=================================");

        t0.run();  // 注意这里改成t0了
        t3.run();
    }
}

这个结果又是什么样的?注释掉打印分隔的等号呢:

public class TestThread2 {
    public static void main(String[] args) {
        Thread t0 = new MyThread();
        Thread t1 = new MyThread();

        Thread t2 = new MyThread();
        Thread t3 = new MyThread();

        t0.start();
        t1.start();
//        注意注释掉了打印等号分隔
//        System.out.println("=================================");

        t0.run();  // 注意这里改成t0了
        t3.run();
    }
}

再再再补充:变变种种题

代码如下:

public class MyRun implements Runnable {
    @Override
    public void run() {
        synchronized (this) {
            for (int i = 0; i < 100; i++) {
                System.out.println(Thread.currentThread().getName() + " " + i);
            }
        }
    }
}

public class TestThread {
    public static void main(String[] args) {
        MyRun myRun = new MyRun();
        Thread thread0 = new Thread(myRun);
        Thread thread1 = new Thread(myRun);

        thread0.start();
        thread1.start();

        System.out.println("=================================");

        thread0.run();
    }
}

2.  什么是单例模式?有几种?

单例模式有5种:

1.饿汉式(Eager Initialization)

类加载的时候就创建。

优点:实现简单、线程安全,不会出现多线程问题;

缺点:实例没有被使用,就会造成资源浪费。

2.懒汉式(Lazy Initialization)

首次使用才创建。

优点:延迟实例化,节省了资源。

缺点:线程不安全。

3.双重检查锁(Double-Checked Locking)

懒汉式加同步锁。

优点:线程安全。

缺点:实现相对复杂,可能存在某些编译器和指令重排序的问题。

4.静态内部类(Static Inner Class)

放在静态内部类中,类加载时保证线程安全。

优点:线程安全且不依赖同步锁。

缺点:实现相对复杂,需要理解静态内部类的特性。

5.枚举(Enum)

用枚举类实现创建、保存单例实例。

优点:实现简单,线程安全,且能防止反射和序列化破坏单例。

缺点:不够灵活,不能延迟实例化。

饿汉的创建详细情况描述补充。

懒汉的创建详情描述补充。

饿汉加静态代码块、懒汉加同步方法的区别,研究这篇文章再补充:

单例模式的八种类型_单例有几种_神偷奶爸的博客-CSDN博客

3.  List 和 Map、Set 的区别

集合存储本质方式不同:

List和Set是单列集合,存储一种数据;Map是双列集合,存储键值对数据。

集合内部存储规律不同:

List内数据是有序的,并且可以重复;

Set内数据是无序的,且不可以重复;

Map内数据是无序的,键不能重复,值可以重复。

关于Set中位置的进一步解析

Set中的位置是固定的,但这没有顺序,还是无序的。

Set中元素的位置由hashcode决定,而这个是固定的。但这个是用户不能控制的,所以还算是无序的。

4.  使用HashMap集合储存数据,什么情况会产生hash冲突?

计算出的hashcode,即哈希值相同时,会产生hash冲突。

5.   Runnable 和 Callable 的区别?

返回上:

Runnable无返回值;Callable有返回值。

异常处理上:

Runnable只能抛出运行时异常,且无法捕获处理;Callable允许抛出异常,可以获取异常信息。文章来源地址https://www.toymoban.com/news/detail-638364.html

到了这里,关于每日后端面试5题 第三天的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 学C的第三十三天【C语言文件操作】

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 学C的第三十二天【动态内存管理】_高高的胖子的博客-CSDN博客  =====================================

    2024年02月13日
    浏览(38)
  • Unity开发日记【第三天】——角色动画效果的实现

    目录 一、站立和跑步动画效果 二、跳跃动画 三、对移动过程中的一些优化和修正 本部分我们尝试给我们的角色添加各种动画效果 首先给角色添加组件Animator,我们可以看见该组件要求一个控制器。 接下来在根目录下新建一个文件夹Animation用来存放所有的动画效果,在文件

    2024年02月05日
    浏览(50)
  • Java超级玛丽小游戏制作过程讲解 第三天 创建并完成常量类02

    今天我们继续完成常量类的创建! 定义了一个名为 `obstacle` 的静态变量,它的类型是 `ListBufferedImage` ,即一个存储 `BufferedImage` 对象的列表。 - `obstacle`: 这是一个列表(List)类型的变量,用于存储多个障碍物的图像。列表是一种数据结构,可以容纳多个元素,并且具有动态

    2024年02月14日
    浏览(56)
  • 后端面试话术集锦第 十五 篇:java线程面试话术

    这是后端面试集锦第十五篇博文—— java 线程面试话术❗❗❗ 首先呢, Thread 类本质上是实现了 Runnable 接口,代表一个线程的实例。 所以, 我们可以编写一个类,继承Thread类,或者直接实现Runnable接口 。然后,再重写下~run方法就行了。启动线程的方式就是调用类里边的 s

    2024年02月10日
    浏览(27)
  • 三天吃透Java面试八股文(2023最新整理),面试通过率高达90%

    什么样的求职者能够获得面试官的青睐?求职者需要准备哪些内容来面对形形色色的面试官?这两份资料是我在几十场面试中被面试官问到的问题, 比其他复制粘贴的面试题强一百倍 ,堪称 全网最强 (我不太喜欢“全网最强”这样的字眼,但确实做到了全网最强)。 写这

    2024年02月13日
    浏览(30)
  • 谷粒商城第三天-微服务中基本组件的使用 java.lang.AbstractMethodError: org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.cho

    目录 一、前言 二、学习的内容 一、Nacos的服务注册/发现 1. 导依赖,nacos-discovery java.lang.AbstractMethodError: org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.cho 2. 在application.yml中声明nacos服务器的ip地址和端口号,以及指定好服务的名称 3. 在启动类上面加上@EnableDiscoverClient 二、

    2024年02月09日
    浏览(81)
  • 每日后端面试5题 第八天

    1.UDP无连接,速度快,安全性低,适合高速传输、实时广播通信等。 2.TCP面向连接,速度慢,安全性高,适合传输质量要求高、大文件等的传输,比如邮件发送等。 (还有:TCP只能是一对一的,UDP支持一对一、一对多、多对一) (还有:TCP首部开销有20个字节;UDP分组首部开

    2024年02月11日
    浏览(42)
  • 每日后端面试5题 第十天

    1.简单工厂 2.工厂方法(Factory Method) 3.单例(Singleton) 4.适配器(Adapter) 5.包装器(Decorator) 6.代理(Proxy) 7.观察者(Observer) 8.策略(Strategy) 9.模板方法(Template Method) 超文本传输协议,基于TCP协议,用于在Web浏览器和Web服务器之间传输HTML页面、图像、视频、音频和其

    2024年02月11日
    浏览(26)
  • 每日后端面试5题 第五天

    1.字符串string 最基本的数据存储类型,普通字符串 SET key value 2.哈希hash 类似于Java中HashMap的结构 HSET key field value 3.列表list 按照插入顺序排序,操作左边或右边,可以有重复元素,类似于Java中的LinkedList LPUSH key value1 [value2] 4.集合set 无序集合,没有重复元素,类似于Java中的H

    2024年02月13日
    浏览(25)
  • 每日后端面试5题 第七天

    内连接只查询出两表的交集; 外连接会查询出某表的全部与两表的交集。 1.反向代理 前端把请求发送给nginx,再由nginx将请求发送给后端服务器。 2.负载均衡 提高访问速度;进行负载均衡;保证后端服务安全 1.数据库类型不同 (1)MySQL是关系型数据库; (2)Redis是缓存数据

    2024年02月13日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包