java面试/笔试题目之多线程及锁 (持续更新中)

前言:这一模块可以参照徐刘根大佬的博客。

一.线程和进程的概念、并行和并发的概念

1.进程:是计算机中的程序关于某数据集合上的一次运行活动,是系统 进行资源分配和调度的基本单位,是操作系统结构的基础。程序是指令、数据及其组织形式的描述,进程是程序的实体。

2.线程:是程序执行流的 最小单元。线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度 的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。在 单个程序中同时运行多个线程完成不同的工作,称为多线程。

3.两者区别:

  • 1、进程是资源分配的最小单位,线程是程序执行的最小单位。
  • 2、进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空 间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是 共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比 进程要小很多,同时创建一个线程的开销也比进程要小很多,线程的上下文切换 的性能消耗要小于进程。
  • 3、线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数 据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互 斥是编写多线程程序的难点。
  • 4、但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉 了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地 址空间。

二.创建线程的方式及实现

创建线程的方法有三种:
(1)继承Thread类,重写run方法;

public class MyThread extends Thread {
    @Override
    public void run() {
        while (true) {
            System.out.println(this.currentThread().getName());
    }
} 
public static void main(String[] args) {
    MyThread thread = new MyThread();
    thread.start(); //线程启动的正确方式
    }
}

启动线程的是start()方法而不是run()方法,run()方法只是一个普通的方法执行了,也就是只是会执行一次,

(2)实现Runnable接口,并将对象实例例作为参数传递给Thread类的构造方法;

public class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("123");
} 
    public static void main(String[] args) {
        MyRunnable myRunnable = new MyRunnable();
        Thread thread = new Thread(myRunnable, "t1");
        thread.start();
    }
}

Thread类本身实现了Runnable接口,并且持有run方法,但Thread类的run方法主体是空的,Thread类的run方法通常是由
子类的run方法重写。

(3)实现callable接口,并实现call方法,并且线程执行完毕后会有返回值。

三.线程间通信的方式

参看:https://blog.csdn.net/striveb/article/details/83542145

四.说说 CountDownLatch、CyclicBarrier 原理和区别

五.说说 Semaphore 原理

六.说说 Exchanger 原理

七.ThreadLocal 原理分析,ThreadLocal为什么会出现OOM,出现的深层次原理

关于ThreadLocal 可以看这个:https://blog.csdn.net/striveb/article/details/83412848

八.讲讲线程池的实现原理

九.线程池的几种实现方式

十.线程的生命周期,状态是如何转移的

十一.什么是synchronized及其特性

   参照下面这三个:

十二.什么是lock对象和ReentrantLock?

https://blog.csdn.net/striveb/article/details/83421107

十三.什么是volatile,有什么作用?

https://blog.csdn.net/striveb/article/details/83537133

徐刘根大佬的多线程专栏:https://blog.csdn.net/column/details/17790.html

猜你喜欢

转载自blog.csdn.net/striveb/article/details/82669660