Java基础题:java并发相关

本文深入探讨了并发编程中的常见概念,如CopyOnWriteArrayList、ReadWriteLock、ConcurrentHashMap及volatile特性,解析了sleep与wait的区别,以及可重入函数的重要性。此外,还详细讲解了进程的三种基本状态,读写锁的工作机制,高响应比优先调度算法,以及如何避免死锁、饥饿和活锁等问题。
摘要由CSDN通过智能技术生成

Ⅰ:
在这里插入图片描述
答案:B

A:CopyOnWriteArrayList适用于写少读多的并发场景
B:ReadWriteLock即为读写锁,他要求写与写之间互斥,读与写之间互斥,读与读之间可以并发执行。在读多写少的情况下可以提高效率
C:ConcurrentHashMap是同步的HashMap,读写都加锁
D:volatile只保证多线程操作的可见性,不保证原子性

有些人可能就会把 i++ 误当成原子操作,其实 i++ 不具备原子性,因为i++做了三次指令操作:
1.从内存中读取i 变量的值到CPU的寄存器;
2.在寄存器中的i自增1;
3.将寄存器中的值写入内存;

Ⅱ:sleep和wait
在这里插入图片描述
答案:D

sleep() 和 wait() 区别:
类不同:sleep() 来⾃ Thread,wait() 来⾃ Object。
释放锁:sleep() 不释放锁;wait() 释放锁。
⽤法不同:sleep() 时间到会⾃动恢复;wait() 可以使用 notify()/notifyAll()直接唤醒。
notify()和 notifyAll()有什么区别?

notifyAll()会唤醒所有的线程,notify()之后唤醒⼀个线程。notifyAll() 调⽤后,会将全部线程由等待池移到锁池,然后参与锁的竞争,竞争成功则继续执⾏,如果不成功则留在锁池等待锁被释放后再次参与竞争。⽽ notify()只会唤醒⼀个线程,具体唤醒哪⼀个线程由虚拟机控制。

只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

Ⅲ:
在这里插入图片描述
注意:自动变量指的是局部变量;

可重入函数主要用于多任务环境中,简单来说就是可以被中断的函数,即在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,返回控制时不会出现什么错误;也意味着它除了使用自己栈上的变量以外不依赖于任何环境(包括static),这样的函数就是 purecode(纯代码)可重入,可以允许有该函数的多个副本在运行,由于它们使用的是分离的栈,所以不会互相干扰。而不可重入的函数由于使用了一些系统资源,比如全局变量区、中断向量表等,所以它如果被中断的话,可能会出现问题,这类函数是不能运行在多任务环境下的。

可重入函数确实需要访问全局变量(包括 static),一定要注意实施互斥手段。它在并行运行环境中非常重要,但是一般要为访问全局变量付出一些性能代价。编写可重入函数时,若使用全局变量,则应通过关中断、信号量(即P、V操作)等手段对其加以保护.

来源:牛客网

Ⅳ:
在这里插入图片描述

在这里插入图片描述
Ⅴ:
在这里插入图片描述
进程的三种基本状态:

(1) 就绪状态:进程已获得除CPU外的所有必要资源,只等待CPU时的状态。一个系统会将多个处于就绪状态的进程排成一个就绪队列。

(2) 执行状态:进程已获CPU,正在执行。单处理机系统中,处于执行状态的进程只一个;多处理机系统中,有多个处于执行状态的进程。

(3) 阻塞状态:正在执行的进程由于某种原因而暂时无法继续执行,便放弃处理机而处于暂停状态,即进程执行受阻。(这种状态又称等待状态或封锁状态)

进程未获得i/o设备故处于阻塞状态,获得i/o设备 ,但未获得cpu资源,故处于就绪状态。

Ⅵ:
在这里插入图片描述
答案:A

对于 Ⅰ ,当所读文件的数据不在内存时,产生中断(缺页中断),原进程进入阻塞状态,直到所需数据从外存调入内存后,才将该进程唤醒。

对于 Ⅱ , read 系统调用通过将 CPU状态 从用户态切换到核心态,从而获取操作系统提供的服务。

对于 Ⅲ ,要读一个文件首先要用 open 系统调用打开该文件。 open 中的参数包含文件的路径名与文件名,而 read 只需要使用 open 返回的文件描述符,并不使用文件名作为参数 。 read 要求用户提供三个输入参数: ① 文件描述符 fd ; ② buf 缓冲区首址; ③ 传送的字节数 n 。 read 的功能是试图从 fd 所指示的文件中读入 n 个字节的数据,并将它们送至由指针 buf 所指示的缓冲区中。

Ⅶ:
在这里插入图片描述
1.当读写锁是写加锁状态时,在这个锁被解锁之前,所有试图对这个锁加锁的线程都会被阻塞。

2.当读写锁在读加锁状态时,所有试图以读模式对它进行加锁的线程都可以得到访问权,但是以写模式对它进行加锁的线程将会被阻塞。

3.当读写锁在读模式的锁状态时,如果有另外的线程试图以写模式加锁,读写锁通常会阻塞随后的读模式锁的请求,这样可以避免读模式锁长期占用,而等待的写模式锁请求则长期阻塞。

Ⅷ:
在这里插入图片描述
高响应比优先算法特点
①当等待时间相同时,短进程的优先权高;
②当需要运行时间相同时,作业的优先权又取决于等待时间,相当于先到先服务;
③长作业的优先级可以随着等待时间的增加而提高,因此长作业等待一段时间后仍能得到调度。

这种算法的思想是综合了 短作业优先调度算法 + 动态优先权机制 的优点,既考虑作业的执行时间也考虑作业的等待时间,综合了先来先服务和最短作业优先两种算法的特点。当一个作业的要求服务时间很短,那么响应比就会很大,有短作业优先的特点;但是当一个作业等待时间太长了,它的响应比又提升了,解决了短作业优先算法容易发生 饥饿 的毛病。
在这里插入图片描述

饥饿现象:某任务长时间得不到机会运行的现象;

Ⅸ:
在这里插入图片描述
在使用锁保证现场安全时可能会出现 活跃度 失败的情况主要包括 饥饿丢失信号活锁死锁 等。

死锁:也就是互相等着对方释放资源,结果谁也得不到。

饥饿 :指线程需要访问的资源被永久拒绝 ,以至于一直得不到执行。解决饥饿问题需要平衡线程对资源的竞争,如线程的优先级、任务的权重、执行的周期等。

活锁 :指线程虽然没有被阻塞,但由于某种条件不满足,一直尝试重试却始终失败。解决活锁问题需要对重试机制引入一些随机性。例如如果检测到冲突,那么就暂停随机的一定时间再进行重试,这会大大减少碰撞的可能性。

Ⅹ:进程和线程
在这里插入图片描述

  • 父进程和子进程都有自己独立的地址空间;
  • 父进程结束,所有子进程都结束。进程结束,所有线程都结束;
  • 如果多个进程同时占有对方需要的资源而同时请求对方的资源,而它们在得到请求之前不会释放所占有的资源,那么就会导致死锁的发生,也就是进程不能实现同步。多线程和多进程都会引起死锁,一般说的死锁指的是进程间的死锁。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值