写点什么

一文详解,java 基础入门第二版课后答案黑马,Java 校招面试

用户头像
极客开源
关注
发布于: 刚刚

1、上下文切换

上下文定义

cpu 发生进程或者线程切换时,所依赖的数据集合,比如一个函数有外部变量,函数运行时,必须获取外部变量,这些变量值的集合就是上下文。

引发问题

对于 CPU 密集型任务,多线程处理会发生上下文切换,会影响到执行速度,如果时 IO 密集型,多线程技术优点尽显。

如何减少上下文切换

  • 无锁并发编程,锁的获取与释放会发生上下文切换,多线程时会影响效率。无锁并发编程就是将数据分块,每个线程处理各自模块。比如 LongAdder 中部分代码。

  • CAS 算法,并发编程时通过 CAS 算法更新数据,而不必加锁。如 Java 的 atomic 包下的工具类。

  • 使用最少线程,减少不必要的线程创建,自定义线程池。

  • 使用协程,在单线程中维护多任务调度,处理任务间切换,Golang 对于协程的使用很强大。

2、死锁

死锁定义

死锁是进程死锁的简称,是由 Dijkstra 于 1965 年研究银行家算法时首先提出来的。系统发生死锁现象不仅浪费大量的系统资源,甚至导致整个系统崩溃,带来灾难性后果。


产生死锁原因

  • 系统资源不足

  • 进程推进顺序不当

  • 资源分配不合理

死锁产生的必要条件

  • 互斥条件:一个资源只能被一个进程或者线程使用。

  • 请求和保持条件:一个进程或者线程,请求资源的时候发生阻塞,对已经获取的资源保持不放。

  • 不可剥夺条件:进程或者线程以获得的资源,在未使用完成时,不能强行剥夺。

  • 循环等待条件:若干进程或者线程形成一种头尾相接的循环等待的资源关系。


这四分条件是死锁产生的必要条件,只要发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。

如何避免死锁

  1. 以确定的顺序获得锁

  2. 加锁时限


Lock 接口提供了 boolean tryLock(long time, TimeUnit unit) throws InterruptedException 方法,该方法可以按照固定时长等待锁,因此线程可以在获取锁超时以后,主动释放之前已经获得的所有的锁。

最后

为什么我不完全主张自学?①平台上的大牛基本上都有很多年的工作经验了,你有没有想过之前行业的门槛是什么样的,现在行业门槛是什么样的?以前企业对于程序员能力要求没有这么高,甚至十多年前你只要会写个“Hello World”,你都可以入门这个行业,所以以前要入门是完全可以入门的。②现在也有一些优秀的年轻大牛,他们或许也是自学成才,但是他们一定是具备优秀的学习能力,优秀的自我管理能力(时间管理,静心坚持等方面)以及善于发现问题并总结问题。如果说你认为你的目标十分明确,能做到第②点所说的几个点,以目前的市场来看,你才真正的适合去自学。


除此之外,对于绝大部分人来说,报班一定是最好的一种快速成长的方式。但是有个问题,现在市场上的培训机构质量参差不齐,如果你没有找准一个好的培训班,完全是浪费精力,时间以及金钱,这个需要自己去甄别选择。


我个人建议线上比线下的性价比更高,线下培训价格基本上没 2W 是下不来的,线上教育现在比较成熟了,此次疫情期间,学生基本上都感受过线上的学习模式。相比线下而言,线上的优势以我的了解主要是以下几个方面:①价格:线上的价格基本上是线下的一半;②老师:相对而言线上教育的师资力量比线下更强大也更加丰富,资源更好协调;③时间:学习时间相对而言更自由,不用裸辞学习,适合边学边工作,降低生活压力;④课程:从课程内容来说,确实要比线下讲的更加深入。


应该学哪些技术才能达到企业的要求?(下图总结)




本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

用户头像

极客开源

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
一文详解,java基础入门第二版课后答案黑马,Java校招面试