企业真题

线程和进程有什么区别

来源:?云网络、?团、腾?、?云网络、神??岳、言?有物、直?科技

  • 进程:对应一个运行中的程序
  • 线程:运行中的进程的一条或多条执行路径

进程与线程

3. 多线程使用场景

来源:嘉?医疗

  • 浏览器:主线程、网络线程、每个标签页的渲染线程、…
  • 多线程下载(迅雷)
  • Tomcat 服务器上 web 应用,多个客户端发起请求,Tomcat 针对多个请求开辟多个线程处理

如何在 Java 中出实现多线程?

来源:阿?校招、当?置业、鸿?网络、奥?医药、?科软、慧?、上海驿?软件、海?科、北京中?瑞飞、锐?(上海)企业管理咨询

四种:

  1. 继承 Thread
  2. 实现 Runnable 接口
  3. 实现 Callable 接口
  4. 线程池

以及四种各自的优劣

Thread 类中的 start()run() 有什么区别?

来源:北京中油??、爱?信、神?泰岳、直?科技、?软国际、上海?学网络、?度

start():① 开启线程 ② 调用线程的 run()

Java 中 RunnableCallable 有什么不同?

来源:平?金服、银?数据、好?在、亿?征信、花儿??网络

  1. call() 可以有返回值,更灵活
  2. call() 可以使用 throws 的方式处理异常,更灵活
  3. Callable 使用了泛型参数,可以指明具体的 call() 的返回值类型,更灵活 ​
    有缺点吗?如果在主线程中需要获取分线程 call() 的返回值,则此时的主线程是阻塞状态的。(也不是缺点、是必然要阻塞的)

什么是线程池,为什么要使用它?

来源:上海明?物联网科技

最主要的:避免了频繁创建、销毁线程的消耗

  • 提高了程序执行的效率(因为线程已经提前创建好了)
  • 提高了资源的复用率(因为执行完的线程并未销毁,而是可以继续执行其他的任务)
  • 可以设置相关的参数,对线程池中的线程的使用进行管理

sleep()yield() 区别?

来源:神?泰岳

  • sleep():一旦调用,就进入“阻塞”(TIMED_WAITING 状态)
  • yield():释放 CPU 的执行权,处在 RUNNABLE 的状态

不同于 wait(),都不释放同步监视器

线程创建的中的方法、属性情况?

来源:招通??、数?互融

Thread 类的常用结构

线程的生命周期?线程的基本状态以及状态之间的关系?

来源:中国??电子商务中心、?科软、慧?、直?科技、华?中?、?兴、美?、字?跳动、?东、?手

线程的生命周期

stop()suspend() 方法为何不推荐使用?

来源:上海驿?软件

stop():一旦执行,线程就结束了,导致 run() 有未执行结束的代码。stop() 会导致释放同步监视器,导致线程安全问题。

suspend():与 resume() 搭配使用,导致死锁。

Java 线程优先级是怎么定义的?

来源:软?动力

三个常量。

范围:[1,10]

你如何理解线程安全的?线程安全问题是如何造成的?

来源:?软国际、奥?医药、?度校招、银?数据、史?夫软件

线程安全问题

避免出现线程安全问题

多线程保证线程安全一般有几种方式?

来源:来?科技、北京?信天?、北京联合??、天?伟业、阿??巴、锐?企业管理咨询、?软国际、?手、海?科

  • 同步机制
  • Lock 接口

synchronized 加在静态方法和普通方法区别

来源:来?科技

同步监视器不同:

  • 静态:当前类的 Class 对象
  • 非静态:this

Java 中 synchronizedReentrantLock 有什么不同

来源:三?重工、中?国际、?美、鸿?网络、美?、字?跳动、阿??巴、?壳

  • synchronized 不管是同步代码块还是同步方法,都需要在结束一对 {} 之后,释放对同步监视器的调用。
  • Lock 是通过两个方法控制需要被同步的代码,更灵活一些。
  • Lock 作为接口,提供了多种实现类,适合更多更复杂的场景,效率更高。

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

来源:鸿?网络

需要看其他方法是否使用 synchronized 修饰,同步监视器是否是同一个。

只有当使用了 synchronized,且是同一个同步监视器的情况下,就不能访问了。

线程同步与阻塞的关系?同步一定阻塞吗?阻塞一定同步吗?

来源:阿?校招、西安?创佳?

  • 同步一定阻塞
  • 阻塞不一定同步

什么是死锁,产生死锁的原因及必要条件?如何避免?

来源:腾?、阿??巴、北京?蓝、?手

死锁

Java 中 notify()notifyAll() 有什么区别

来源:汇?天下

  • notify():唤醒被 wait() 的线程中优先级最高的那一个线程。如果被 wait() 的多个线程的优先级相同,则随机唤醒一个。
  • notifyAll():唤醒所有被 wait 的线程。

被唤醒的线程从当初被 wait 的位置继续执行

为什么 wait()notify() 方法要在同步块中调用

来源:北京?智

因为调用者必须是同步监视器

多线程:生产者,消费者代码(同步、waitnotifly 编程)

来源:猫?娱乐、上海明?物联网、?为、字?跳动

生产者与消费者问题

wait()sleep() 有什么区别?调用这两个函数后,线程状态分别作何改变?

来源:字?跳动、?东、外派?度、阿??巴、软?动力、?创

sleep() 和 wait()

手写一个单例模式(Singleton)

来源:?通快递、君?科技、5?同城、北京联合??

饿汉式:

public class Singleton {
    private static final Singleton INSTANCE = new Singleton(); 
    
    private Singleton() {}
    
    public static Singleton getInstance() {
        return INSTANCE;
    }
}

懒汉式:

public class Singleton {
    private static volatile Singleton instance;
 
    private Singleton() {}
 
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

单例模式