当前位置:   article > 正文

Java并发编程经典题目整理(2022.03.11 更新)_并发编程练习资源

并发编程练习资源

并行是指,多个处理器或者多核处理器同时执行处理多个任务,注意是同时执行。从CPU层面上来看,并发就是大量的任务在同一个CPU核上交替的按CPU提供的时间片运行。

举个栗子:

  • 并行:两个打饭窗口,两个队(一个窗口一个有条理)。
  • 并发:一个打饭窗口,两个队(交替)。

也就是说并发这样的情况如果是同时发生在多个CPU核上,那么就很有可能出现并行问题。

所以我们在使用多线程时:考虑的一般都是,高并发环境下,程序内部可能发生并行执行而导致某些错误的问题

线程和进程的区别?
  • 进程是操作系统中执行的一段程序,线程是CPU调度资源的单位。
  • 进程包含线程,类比我们的浏览器,他在操作系统层面就是一个进程,然后浏览器中的各个可以使用的设置就是浏览器这个进程中的线程。
  • 一个进程可以有多个线程,一个线程对应一个进程。
守护线程是什么?

我们用的最多的守护线程估计就是 JVM 的垃圾回收线程了,它在后台运行并且在满足一定条件下会进行垃圾回收,也可以按时回收。

所以守护线程,守护线程它是在后台运行的一种特殊进程,它能周期性的执行一些任务,独立于控制终端,也能等待处理某些发生的事件(垃圾回收)。

换句话来说,守护线程它拥有能够结束自己生命周期的能力,直接进行一个我命由我不由天

守护线程的作用?

我们拿 JVM 的垃圾回收线程来说,当我们的 JVM 要被关闭的时候,如果此时正在进行着垃圾回收,并且得持续一段时间,那么如果垃圾回收线程不是守护线程的话,整个 JVM 就得等到我们这个垃圾回收结束之后才能关闭。

但是如果垃圾回收线程它是守护线程,那么它的垃圾回收和JVM关闭就类似于异步,你可以先走,我自己清理完了我自己走

也避免了有些时候 JVM 突然崩溃,但是内存中又有对象垃圾,这个时候守护线程就可以再 JVM 崩溃之后,独立的清理完毕这些垃圾然后自我销毁。

什么是线程的死锁?
  • 我们通常来说的死锁就是两个或者两个以上的线程在执行的过程中,他们由于资源竞争或者由于彼此通信造成的一种阻塞的现象,这种现象很常见,但是如果是没有外力干扰就会无限制的阻塞的话,这种情况就是死锁。
  • 比如线程A持有锁A,线程B持有锁B,此时线程A在锁A内请求锁B,线程B在锁B内请求锁A,造成无限期的阻塞。
那么死锁形成的必要条件有哪些呢?
  1. 互斥条件:意思就是,这个临界资源一定是一个互斥锁,在一段时间内,这个资源只能被一个进程占用,如果此时还有其进程请求正在被占用的这个临界资源,就只能等待到当前占用该资源的进程释放锁。
  2. 占有且等待条件:这个好理解,就是一个进程已经占有了一个互斥条件的临界资源,没释放,并且又去请求另一个临界资源,但是此时请求的另一个临界资源被占用,所以此时这个进程就等待,并且还占有资源。
  3. 不可抢占条件:互斥锁的临界资源,一个进程占用,别的进程只能等待释放,而不能抢夺。
  4. 循环等待条件:比如线程A持有锁A,线程B持有锁B,此时线程A在锁A内请求锁B,线程B在锁B内请求锁A,造成无限期的阻塞。

以上四个条件就是死锁产生的必要条件。

那么我们如何避免死锁呢?

首先我们可以避免一个线程同时拥有多个锁,或者避免一个线程在所内同时占用多个资源,尽量去保证每个锁只占用一个资源;尝试使用定时锁,就是时间一到就会解锁的锁。

线程创建有哪几种方式?

在 Java 中一共有四种:

  • 继承 Thread 类,重写它的 run 方法。
  • 实现 Runnable 接口。
  • 实现 Callable 接口。
  • 使用线程池。
线程的状态说一下?
  • 新建(new):新的线程对象被创建。
  • 就绪(可运行状态,runnable):当线程对象调用 start() 方法之后进入该状态,等待调度。
  • 运行(running&
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/926063
推荐阅读
相关标签
  

闽ICP备14008679号