大厂Java面试题——并发篇(1)

导读:本篇文章讲解 大厂Java面试题——并发篇(1),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

目录

💴哈喽,大家好丫,你们的小郭子又来啦 ~

🌞1. 并行和并发有什么区别?

🌞2. 线程和进程的区别?

🌞3. 创建线程的几种方式?

🌞4. Runnable 和 Callable 有什么区别?

🌞5. 线程状态及转换?

🌞6. sleep() 和 wait() 的区别?

🌞7. 线程的 run() 和 start() 有什么区别?

🌞8. 在 Java 程序中怎么保证多线程的运行安全?


💴哈喽,大家好丫,你们的小郭子又来啦 ~

🌞今天我们继续聊一聊java面试中的【并发】,

话不多说,直接上干货,嘻嘻嘻 ~

                大厂Java面试题——并发篇(1)大厂Java面试题——并发篇(1)

🌞1. 并行和并发有什么区别?

🌞4. Runnable 和 Callable 有什么区别?

  • 并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生;

  • 并行是在不同实体上的多个事件,并发是在同一实体上的多个事件;

  • 一台处理器上“同时”处理多个任务,在多台处理器上同时处理多个任务。如 Hadoop 分布式集群。所以并发编程的目标是充分的利用处理器的每一个核,以达到最高的处理性能。

    🌞2. 线程和进程的区别?

  • 进程:是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程。进程在执行过程中拥有独立的内存单元,而多个线程共享内存资源,减少切换次数,从而效率更高。

  • 线程:是进程的一个实体,是 cpu 调度和分派的基本单位,是比程序更小的能独立运行的基本单位。同一进程中的多个线程之间可以并发执行。

    🌞3. 创建线程的几种方式?

  • 继承 Thread 类创建线程;

  • 实现 Runnable 接口创建线程;

  • 通过 Callable 和 Future 创建线程;

  • 通过线程池创建线程。

  • Runnable 接口中的 run() 方法的返回值是 void,它做的事情只是纯粹地去执行 run() 方法中的代码而已;

  • Callable 接口中的 call() 方法是有返回值的,是一个泛型,和 Future、FutureTask 配合可以用来获取异步执行的结果。

    🌞5. 线程状态及转换?

  • Thread 的源码中定义了6种状态:new(新建)、runnnable(可运行)、blocked(阻塞)、waiting(等待)、time waiting (定时等待)和 terminated(终止)。

  • 大厂Java面试题——并发篇(1)

  • 线程状态转换如下图所示:
  • 大厂Java面试题——并发篇(1)

🌞6. sleep() 和 wait() 的区别?

  • sleep() 方法正在执行的线程主动让出 cpu(然后 cpu 就可以去执行其他任务),在 sleep 指定时间后 cpu 再回到该线程继续往下执行(注意:sleep 方法只让出了 cpu,而并不会释放同步资源锁);
  • 而 wait() 方法则是指当前线程让自己暂时退让出同步资源锁,以便其他正在等待该资源的线程得到该资源进而运行,只有调用了 notify() 方法,之前调用 wait() 的线程才会解除 wait 状态,可以去参与竞争同步资源锁,进而得到执行。(注意:notify 的作用相当于叫醒睡着的人,而并不会给他分配任务,就是说 notify 只是让之前调用 wait 的线程有权利重新参与线程的调度);
  •  sleep() 方法可以在任何地方使用,而 wait() 方法则只能在同步方法或同步块中使用;
  • sleep() 是线程类(Thread)的方法,调用会暂停此线程指定的时间,但监控依然保持,不会释放对象锁,到时间自动恢复;wait() 是 Object 的方法,调用会放弃对象锁,进入等待队列,待调用 notify()/notifyAll() 唤醒指定的线程或者所有线程,才会进入锁池,不再次获得对象锁才会进入运行状态。

🌞7. 线程的 run() 和 start() 有什么区别?

1、每个线程都是通过某个特定 Thread 对象所对应的方法 run() 来完成其操作的,方法 run() 称为线程体。通过调用 Thread 类的 start() 方法来启动一个线程;

2、start() 方法来启动一个线程,真正实现了多线程运行。这时无需等待 run() 方法体代码执行完毕,可以直接继续执行下面的代码;这时此线程是处于就绪状态,并没有运行。然后通过此 Thread 类调用方法 run() 来完成其运行状态,这里方法 run() 称为线程体,它包含了要执行的这个线程的内容,run() 方法运行结束,此线程终止。然后 cpu 再调度其它线程

3、 run() 方法是在本线程里的,只是线程里的一个函数,而不是多线程的。如果直接调用 run(),其实就相当于是调用了一个普通函数而已,直接调用 run() 方法必须等待 run() 方法执行完毕才能执行下面的代码,所以执行路径还是只有一条,根本就没有线程的特征,所以在多线程执行时要使用 start() 方法而不是 run() 方法。

🌞8. 在 Java 程序中怎么保证多线程的运行安全?

线程安全在三个方面体现:

原子性:提供互斥访问,同一时刻只能有一个线程对数据进行操作,(atomic,synchronized);

可见性:一个线程对主内存的修改可以及时地被其他线程看到,(synchronized、volatile);

有序性:一个线程观察其他线程中的指令执行顺序,由于指令重排序,该观察结果一般杂乱无序,(happens-before 原则)。

🐳好啦,今天的分享到这里就结束啦 ~

🐳觉得我分享的文章不错的话,可以关注一下哦,嘻嘻嘻

                        大厂Java面试题——并发篇(1)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/73254.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!