目录
-
-
-
- 线程和进程的区别?
- 守护线程是什么?
- 守护线程的作用?
- 什么是线程的死锁?
- 那么死锁形成的必要条件有哪些呢?
- 那么我们如何避免死锁呢?
- 线程创建有哪几种方式?
- 线程的状态说一下?
- 说一说你知道的与线程同步以及线程调度相关的方法?
- 那么你是如何调用 wait() 方法的?为什么?
- 为什么 wait()、notify()、notifyAll() 必须在同步方法或者同步块中被调用?
- interrupted() 和 isInterrupted() 方法的区别?
- sleep() 和 wait() 的区别?
- notify() 和 notifyAll() 有什么区别?
- 请你解释一下 volatile?
- 请你说一下 volatile 他是怎么保证可见性的?
- volatile 具体是怎么保证可见的呢?
- CPU嗅探总线的过程中,它怎么知道 volatile 修饰的呢?
- volatile 如何禁止指令重拍序呢?
- 说一说 volatile 对于原子性的理解?
- synchronized 关键字作用在不同的地方有什么区别?
- synchronized 和 volatile 到底有什么区别?
- synchronized 和 Lock 有什么区别?
-
-
并行是指,多个处理器或者多核处理器同时执行处理多个任务,注意是同时执行。从CPU层面上来看,并发就是大量的任务在同一个CPU核上交替的按CPU提供的时间片运行。
举个栗子:
- 并行:两个打饭窗口,两个队(一个窗口一个有条理)。
- 并发:一个打饭窗口,两个队(交替)。
也就是说并发这样的情况如果是同时发生在多个CPU核上,那么就很有可能出现并行问题。
所以我们在使用多线程时:考虑的一般都是,高并发环境下,程序内部可能发生并行执行而导致某些错误的问题。
线程和进程的区别?
- 进程是操作系统中执行的一段程序,线程是CPU调度资源的单位。
- 进程包含线程,类比我们的浏览器,他在操作系统层面就是一个进程,然后浏览器中的各个可以使用的设置就是浏览器这个进程中的线程。
- 一个进程可以有多个线程,一个线程对应一个进程。
守护线程是什么?
我们用的最多的守护线程估计就是 JVM 的垃圾回收线程了,它在后台运行并且在满足一定条件下会进行垃圾回收,也可以按时回收。
所以守护线程,守护线程它是在后台运行的一种特殊进程,它能周期性的执行一些任务,独立于控制终端,也能等待处理某些发生的事件(垃圾回收)。
换句话来说,守护线程它拥有能够结束自己生命周期的能力,直接进行一个我命由我不由天。
守护线程的作用?
我们拿 JVM 的垃圾回收线程来说,当我们的 JVM 要被关闭的时候,如果此时正在进行着垃圾回收,并且得持续一段时间,那么如果垃圾回收线程不是守护线程的话,整个 JVM 就得等到我们这个垃圾回收结束之后才能关闭。
但是如果垃圾回收线程它是守护线程,那么它的垃圾回收和JVM关闭就类似于异步,你可以先走,我自己清理完了我自己走。
也避免了有些时候 JVM 突然崩溃,但是内存中又有对象垃圾,这个时候守护线程就可以再 JVM 崩溃之后,独立的清理完毕这些垃圾然后自我销毁。
什么是线程的死锁?
- 我们通常来说的死锁就是两个或者两个以上的线程在执行的过程中,他们由于资源竞争或者由于彼此通信造成的一种阻塞的现象,这种现象很常见,但是如果是没有外力干扰就会无限制的阻塞的话,这种情况就是死锁。
- 比如线程A持有锁A,线程B持有锁B,此时线程A在锁A内请求锁B,线程B在锁B内请求锁A,造成无限期的阻塞。
那么死锁形成的必要条件有哪些呢?
- 互斥条件:意思就是,这个临界资源一定是一个互斥锁,在一段时间内,这个资源只能被一个进程占用,如果此时还有其进程请求正在被占用的这个临界资源,就只能等待到当前占用该资源的进程释放锁。
- 占有且等待条件:这个好理解,就是一个进程已经占有了一个互斥条件的临界资源,没释放,并且又去请求另一个临界资源,但是此时请求的另一个临界资源被占用,所以此时这个进程就等待,并且还占有资源。
- 不可抢占条件:互斥锁的临界资源,一个进程占用,别的进程只能等待释放,而不能抢夺。
- 循环等待条件:比如线程A持有锁A,线程B持有锁B,此时线程A在锁A内请求锁B,线程B在锁B内请求锁A,造成无限期的阻塞。
以上四个条件就是死锁产生的必要条件。
那么我们如何避免死锁呢?
首先我们可以避免一个线程同时拥有多个锁,或者避免一个线程在所内同时占用多个资源,尽量去保证每个锁只占用一个资源;尝试使用定时锁,就是时间一到就会解锁的锁。
线程创建有哪几种方式?
在 Java 中一共有四种:
- 继承 Thread 类,重写它的 run 方法。
- 实现 Runnable 接口。
- 实现 Callable 接口。
- 使用线程池。
线程的状态说一下?
- 新建(new):新的线程对象被创建。
- 就绪(可运行状态,runnable):当线程对象调用 start() 方法之后进入该状态,等待调度。
- 运行(running&