当前位置: 首页 > news >正文

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() 如果不唤醒就一直等下去,它们都可以被打断唤醒
    3. 锁特性不同(重点)
    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引入了两种新型锁机制:偏向锁和轻量级锁,它们的引入是为了解决在没有多线程竞争或基本没有竞争的场景下因使用传统锁机制带来的性能开销问题。

http://www.lryc.cn/news/329315.html

相关文章:

  • 【C++】set和map
  • yolov5 v7.0打包exe文件,使用C++调用
  • 保研线性代数机器学习基础复习2
  • vultr ubuntu 服务器远程桌面安装及连接
  • 前端学习<二>CSS基础——12-CSS3属性详解:动画详解
  • Sqoop 的安装与配置
  • Mysql设置访问权限(docker配置)
  • 【Linux】详解软硬链接
  • 维修贝加莱4PP420.1043-B5触摸屏Power Panel 400工业电脑液晶
  • Java_21 完成一半题目
  • 【WPF应用21】WPF 中的 TextBox 控件详解与示例
  • 小程序页面传参?
  • C++list的模拟实现
  • Leetcode 187. 重复的DNA序列
  • 都江堰泛计算操作系统(多机)应用方向
  • 【第十二届“泰迪杯”数据挖掘挑战赛】【2024泰迪杯】B题基于多模态特征融合的图像文本检索—解题全流程(论文更新)
  • 蓝桥杯22年第十三届省赛-统计子矩阵|一维前缀和加双指针
  • SaaS 电商设计 (十) 记一次 5000kw 商品数据ES迁移 (详细的集群搭建以及线上灰度过程设计)
  • linux安装Tomcat
  • 【机器学习300问】57、机器是如何读得懂文本数据的呢?
  • 了解XSS和CSRF攻击与防御
  • NEO 学习之 MLE(最大似然估计)
  • going和Java对比有什么不同
  • RabbitMQ面经 手打浓缩版
  • JavaScript引用数据类型
  • Mac m1 Flink的HelloWorld
  • 3.1 Python变量的定义和使用
  • OceanBase中左外连接和反连接的经验分享
  • 如何提升公众号搜索量?分享内部运营的5步优化技术!
  • 【2024】根据系统平均负载情况排查隐患