首页 > 编程语言 >Java面试之多线程&并发篇(2)

Java面试之多线程&并发篇(2)

时间:2024-11-12 21:57:55浏览次数:1  
标签:调用 Java 对象 并发 线程 notify 多线程 方法 wait

前言

本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!Thread 类中的start() 和 run() 方法有什么区别?为什么wait, notify 和 notifyAll这些方法不在thread类里面?为什么wait和notify方法要在同步块中调用?Java中interrupted 和 isInterruptedd方法的区别?ava中synchronized 和 ReentrantLock 有什么不同?似乎有点模糊了,那就大概看一下面试题吧。好记性不如烂键盘

*** 12万字的java面试题整理 ***

Thread 类中的start() 和 run() 方法有什么区别?

start()方法被用来启动新创建的线程,而且start()内部调用了run()方法,这和直接调用run()方法的效果不一样。当你调用run()方法的时候,只会是在原来的线程中调用,没有新的线程启动,start()方法才会启动新线程。

为什么wait, notify 和 notifyAll这些方法不在thread类里面?

明显的原因是JAVA提供的锁是对象级的而不是线程级的,每个对象都有锁,通过线程获得。如果线程需要等待某些锁那么调用对象中的wait()方法就有意义了。如果wait()方法定义在Thread类中,线程正在等待的是哪个锁就不明显了。简单的说,由于wait,notify和notifyAll都是锁级别的操作,所以把他们定义在Object类中因为锁属于对象。

为什么wait和notify方法要在同步块中调用?

  1. 只有在调用线程拥有某个对象的独占锁时,才能够调用该对象的wait(),notify()和notifyAll()方法。
  2. 如果你不这么做,你的代码会抛出IllegalMonitorStateException异常。
  3. 还有一个原因是为了避免wait和notify之间产生竞态条件。

wait()方法强制当前线程释放对象锁。这意味着在调用某对象的wait()方法之前,当前线程必须已经获得该对象的锁。因此,线程必须在某个对象的同步方法或同步代码块中才能调用该对象的wait()方法。

在调用对象的notify()和notifyAll()方法之前,调用线程必须已经得到该对象的锁。因此,必须在某个对象的同步方法或同步代码块中才能调用该对象的notify()或notifyAll()方法。

调用wait()方法的原因通常是,调用线程希望某个特殊的状态(或变量)被设置之后再继续执行。调用notify()或notifyAll()方法的原因通常是,调用线程希望告诉其他等待中的线程:"特殊状态已经被设置"。这个状态作为线程间通信的通道,它必须是一个可变的共享状态(或变量)。

Java中interrupted 和 isInterruptedd方法的区别?

interrupted() 和 isInterrupted()的主要区别是前者会将中断状态清除而后者不会。Java多线程的中断机制是用内部标识来实现的,调用Thread.interrupt()来中断一个线程就会设置中断标识为true。

当中断线程调用静态方法Thread.interrupted()来检查中断状态时,中断状态会被清零。而非静态方法isInterrupted()用来查询其它线程的中断状态且不会改变中断状态标识。简单的说就是任何抛出InterruptedException异常的方法都会将中断状态清零。无论如何,一个线程的中断状态有有可能被其它线程调用中断来改变。

Java中synchronized 和 ReentrantLock 有什么不同?

相似点:
这两种同步方式有很多相似之处,它们都是加锁方式同步,而且都是阻塞式的同步,也就是说当如果一个线程获得了对象锁,进入了同步块,其他访问该同步块的线程都必须阻塞在同步块外面等待,而进行线程阻塞和唤醒的代价是比较高的.

区别:
这两种方式最大区别就是对于Synchronized来说,它是java语言的关键字,是原生语法层面的互斥,需要jvm实现。而ReentrantLock它是JDK 1.5之后提供的API层面的互斥锁,需要lock()和unlock()方法配合try/finally语句块来完成。

Synchronized进过编译,会在同步块的前后分别形成monitorenter和monitorexit这个两个字节码指令。在执行monitorenter指令时,首先要尝试获取对象锁。如果这个对象没被锁定,或者当前线程已经拥有了那个对象锁,把锁的计算器加1,相应的,在执行monitorexit指令时会将锁计算器就减1,当计算器为0时,锁就被释放了。如果获取对象锁失败,那当前线程就要阻塞,直到对象锁被另一个线程释放为止。

由于ReentrantLock是java.util.concurrent包下提供的一套互斥锁,相比Synchronized,ReentrantLock类提供了一些高级功能,主要有以下3项:
1.等待可中断,持有锁的线程长期不释放的时候,正在等待的线程可以选择放弃等待,这相当于Synchronized来说可以避免出现死锁的情况。
2.公平锁,多个线程等待同一个锁时,必须按照申请锁的时间顺序获得锁,Synchronized锁非公平锁,ReentrantLock默认的构造函数是创建的非公平锁,可以通过参数true设为公平锁,但公平锁表现的性能不是很好。
3.锁绑定多个条件,一个ReentrantLock对象可以同时绑定对个对象。

标签:调用,Java,对象,并发,线程,notify,多线程,方法,wait
From: https://www.cnblogs.com/xswz/p/18542737

相关文章

  • javaweb基于SSH开发大学生在线选课系统源码+PPT 大作业 课程设计
    ......
  • word模板填充 java
    From: https://blog.51cto.com/u_16213356/12447686在现代开发中,Word文档的自动生成和模板填充是一项非常常见的需求。尤其是在生成报表、合同、信函等场景时,通过代码自动化填充模板可以极大提高工作效率。本文将详细介绍如何使用Java实现Word模板填充。我们将通过以下步骤......
  • 基于java+ssm的高校奖助学金系统
    前言基于Java+SSM的高校奖助学金系统能高效、公平地管理奖助学金相关事务。系统存储了丰富的学生信息,包括基本资料、学业成绩、综合素质评价、家庭经济情况等。这些数据为奖助学金评定提供依据。在奖助学金项目管理方面,详细记录每个奖项和助学金的名称、设立条件、金......
  • 基于java+ssm的辅助计算机教学的多媒体素材库系统
    前言基于Java+SSM(Spring+SpringMVC+MyBatis)的辅助计算机教学的多媒体素材库系统为计算机教学带来极大便利。系统可实现多媒体素材的分类存储,涵盖文本、图片、音频、视频、动画等多种类型。教师能根据课程主题、知识点将素材进行精准分类,比如编程课程的代码示例文......
  • 基于java+springcloud的微服务小型气象站后端管理系统
    前言基于Java+SpringCloud的微服务小型气象站后端管理系统为气象数据的采集、分析与应用提供了有力支持。系统可连接多个小型气象站设备,接收包括温度、湿度、气压、风速、风向、降水量等气象数据。这些数据在传入系统后会经过严格的校验和清洗,确保数据的准确性和完......
  • 基于java+springcloud的微服务的手机商城管理系统
    前言基于Java+SpringCloud的微服务手机商城管理系统具有高度的灵活性和可扩展性。系统在商品管理方面表现卓越,详细记录每一款手机的信息,包括品牌、型号、配置、颜色、价格、库存等。商家可以轻松添加新手机款式、修改商品信息或调整价格,还能实时监控库存水平,当库存......
  • 使用Java填充Word模板的方法详解
    From: https://www.jb51.net/program/324679hhw.htmJava填充Word模板是一种将动态数据插入到Word文档模板中生成最终文档的过程,通常用于批量创建包含个人信息、报告结果或其他动态内容的文档,本文给大家介绍了使用Java填充Word模板的方法,需要的朋友可以参考下 +目录概......
  • 基于java+springboot的Vehicle management系统网站
    课题说明基于Java+SpringBoot的Vehiclemanagement系统网站是一款专门用于车辆管理的综合性网络平台。该网站可实现车辆基本信息管理,详细记录车辆型号、车架号、发动机号、购置日期、颜色等内容,方便随时查询和更新。车辆状态跟踪功能可标记车辆是处于闲置、使用中、......
  • 基于java+springboot的社区帮帮团系统网站
    前言基于java+springboot的社区帮帮团系统网站是一个促进社区互助的综合性平台。它为社区居民提供便捷的注册与登录入口。居民可发布求助信息,详细描述问题,如家电维修、管道疏通、家教需求等,并可设置悬赏金额。同时,有能力提供帮助的居民能浏览这些求助,根据自身技能和......
  • 基于java+springboot的免费体育馆场地预约系统
    前言基于Java+SpringBoot的免费体育馆场地预约系统为民众健身提供了便利。系统存储体育馆各个场地的详细信息,包括场地类型(如篮球场、羽毛球场、乒乓球场等)、场地规格、可容纳人数、配套设施(如灯光、计分牌等)。用户可以方便地查看这些信息,根据自身需求选择合适的场地......