Java多线程学习(概念笔记)

面试题:并行和并发有什么区别?

现在都是多核CPU,在多核CPU下

并发是同一时间应对多件事情的能力,多个线程轮流使用一个或多个CPU

并行是同一时间动手做多件事情的能力,4核CPU同时执行4个线程

面试题:创建线程的方式有哪些?

继承Thread类

实现runnable接口

实现Callable接口

线程池创建线程(项目中使用方式)

面试题:runnable 和 callable 有什么区别?

Runnable 接口run方法没有返回值

Callable接口call方法有返回值,需要FutureTask获取结果

Callable接口的call()方法允许抛出异常;而Runnable接口的run()方法的异常只能在内部消化,不能继续上抛

面试题:线程包括哪些状态?
新建(NEW)、可运行(RUNNABLE)、阻塞(BLOCKED)、等待( WAITING )、时间等待(TIMED_WALTING)、终止(TERMINATED)

面试题:线程状态之间是如何变化的?

1、创建线程对象是新建状态

2、调用了start()方法转变为可执行状态

3、线程获取到了CPU的执行权,执行结束是终止状态
在可执行状态的过程中,如果没有获取CPU的执行权,可能会切换其他状态
如果没有获取锁(synchronized或lock)进入阻塞状态,获得锁再切换为可执行状态
如果线程调用了wait()方法进入等待状态,其他线程调用notify()唤醒后可切换为可执行状态
如果线程调用了sleep(50)方法,进入计时等待状态,到时间后可切换为可执行状态

面试题:新建 T1、T2、T3 三个线程,如何保证它们按顺序执行?可以使用线程中的join方法解决。t.join(),阻塞调用此方法的线程进入timed_waiting直到线程t执行完成后,此线程再继续执行

面试题:notify()和 notifyAll()有什么区别?notifyAll:唤醒所有wait的线程;notify:只随机唤醒一个 wait 线程

面试题:在java中wait和sleep方法的不同?

共同点:wait() ,wait(long) 和 sleep(long) 的效果都是让当前线程暂时放弃 CPU 的使用权,进入阻塞状态。

不同点

1.方法归属不同,sleep(long) 是 Thread 的静态方法。而 wait(),wait(long) 都是 Object 的成员方法,每个对象都有

2.醒来时机不同,执行 sleep(long) 和 wait(long) 的线程都会在等待相应毫秒后醒来

wait(long) 和 wait() 还可以被 notify 唤醒,wait() 如果不唤醒就一直等下去,它们都可以被打断唤醒

  1. 锁特性不同(重点)
    wait 方法的调用必须先获取 wait 对象的锁,而 sleep 则无此限制
    wait 方法执行后会释放对象锁,允许其它线程获得该对象锁(我放弃 cpu,但你们还可以用)
    而 sleep 如果在 synchronized 代码块中执行,并不会释放对象锁(我放弃 cpu,你们也用不了)

面试题:synchronized关键字的底层原理
Synchronized【对象锁】采用互斥的方式让同一时刻至多只有一个线程能持有【对象锁】
它的底层由monitor实现的,monitor是jvm级别的对象( C++实现),线程获得锁需要使用对象(锁)关联monitor
在monitor内部有三个属性,分别是owner、entrylist、waitset
其中owner是关联的获得锁的线程,并且只能关联一个线程;entrylist关联的是处于阻塞状态的线程;waitset关联的是处于Waiting状态的线程

面试题:Monitor实现的锁属于重量级锁,你了解过锁升级吗?Monitor 被翻译为监视器,是由jvm提供,c++语言实现
Owner:存储当前获取锁的线程的,只能有一个线程可以获取
EntryList:关联没有抢到锁的线程,处于Blocked状态的线程
WaitSet:关联调用了wait方法的线程,处于Waiting状态的线程
Monitor实现的锁属于重量级锁,里面涉及到了用户态和内核态的切换、进程的上下文切换,成本较高,性能比较低。
在JDK 1.6引入了两种新型锁机制:偏向锁和轻量级锁,它们的引入是为了解决在没有多线程竞争或基本没有竞争的场景下因使用传统锁机制带来的性能开销问题。

相关推荐
dawn19122810 分钟前
SpringMVC 中的域对象共享数据
java·前端·servlet
Xwzzz_14 分钟前
Nginx配置负载均衡
java·nginx·负载均衡
小叶子来了啊16 分钟前
002.k8s(Kubernetes)一小时快速入门(先看docker30分钟)
java·容器·kubernetes
DKPT28 分钟前
数据结构之快速排序、堆排序概念与实现举例
java·数据结构·算法
尘浮生31 分钟前
Java项目实战II基于Java+Spring Boot+MySQL的校园社团信息管理系统(源码+数据库+文档)
java·开发语言·数据库·spring boot·mysql·spring·maven
lj9077226441 小时前
Dockerfile部署xxljob
java·docker
多则惑少则明1 小时前
idea 编辑器常用插件集合
java·编辑器·intellij-idea
BLUcoding2 小时前
RabbitMQ08_保证消息可靠性
java·rabbitmq
MogulNemenis2 小时前
力扣415周赛
java·数据结构·算法·leetcode
ai安歌2 小时前
【JavaWeb】利用IDEA2024+tomcat10配置web6.0版本搭建JavaWeb开发项目
java·开发语言·后端·tomcat·web·intellij idea