OMG,学它!我离职后面试收割小米等大厂offer

前言

二面大概50分钟,问的东西很全面,需要做充足准备,就是除了概念以外问的有点懵逼了(呜呜呜)。回来之后把这些题目做了一个分类并整理出答案(强迫症的我狂补知识~)分为spring,jvm,并发编程等,接下来分享一下我的这蚂蚁金服面试的面经+一些我的学习笔记。

蚂蚁金服二面被血虐,spring/并发/JVM把我直接问懵,我经历了什么?

一、公务员都不要35岁以上的,何况大公司

这让很多人感到惶恐,现在职场上有一种现象:很多用人单位会在招聘信息上明确标注,年龄需在35岁以下。为什么有经验、有人脉的职场中年人会如此遭“嫌弃”呢?

首先,思想落后。日新月异的时代需要不断进步的人,而不是守着自己那点老经验的“职场前辈”。

的确,现在很多职场人无论年龄多大,一直追随着时代的脚步,坚持做一个“老顽童”。

但又有多少人,放弃了对新时代的探索,固守自己的老思想,成为一个名副其实的老油条。

再次,家庭牵绊。人到中年,基本都有爱人和孩子,工作成为你生活中的一部分,一到下班点,就想着回家给孩子做饭。

你不再对工作全情投入,但对于年轻人,工作是他们的全部,为了梦想,通俗地说,为了升职加薪,他们可以全力以赴。

最后,自视甚高。这是很多职场前辈都会有的心理,自认为自己多吃了几碗大米饭,就可以高人一等。

的确,职场前辈们比年轻人经验丰富、能力强,但是过几年之后呢?你可以利用几年提升自己,其他人照样可以,难道到时企业会放着精力旺盛的年轻人不用,而用你吗?

自视甚高所导致的直接后果就是不再提高自己,在眼界和思想上停滞不前。

IBM的残酷现实告诉我们,如果你不进步,到了中年,只能是被公司抛弃的“老帮菜”。

二、35岁之前要做的最重要的一件事:投资自己

巴菲特曾在接受《福布斯》采访时称:“最终,有一种投资超过所有其他投资:投资你自己。

没有人能够夺走你自己内在的东西,每个人都有自己尚未使用的潜力。

如果你还没到35岁,请尽快开始投资自己;如果你已经过了35岁,请马上开始投资自己。为了避免陷入中年危机,我们要开始拯救自己。

曾获艾美奖的、被《纽约时报杂志》称为“来自热带的商业奇才”的著名电视制作人內莉·加兰在《最好的投资就是投资自己:成为自立、自信、富有的你》一书中说: “投资自己意味着你能自主选择喜欢的工作,而不是被动接受一份工作,意味着你能用教育、旅行、住房等犒劳自己和子女,意味着你每天晚上都能高枕无忧。”

投资自己是一种心态,唯一能够改变你的人就是你自己。那么该如何投资自己?

① .除了自己,世上没有什么能永远倚靠

《最好的投资就是投资自己:成为自立、自信、富有的你》中有一句话说得很好:“我们若想靠别人帮我们实现梦想,那么其实就已放弃了自己的梦想。”

② 只有你学到的东西是任何人都带不走的

职场中,能够让我们保持竞争力的方法就是不断学习。

虽然说人到中年可能会陷入危机,但是我们的人生不应该让年龄所限制。

35岁不是能力减弱的标志线,而应该是经验丰富、财务独立的分水岭。

学习,是我们在职场中不断进化的根本。高考前,老师总告诉我们,等上了大学你们就不用学习了。等我们上了大学,就会发现,不学习的人不仅与奖学金无缘,毕业后与好的offer也毫无瓜葛。

知识不断更迭的时代我们也要不断更新我们的知识库,不断追随最前沿的知识领域。除此之外,我们更要根据自己所在的领域,针对性地学习与提高。

根据我们的职业规划、工作需求,不断地更新自己。最后,我们还要对自己的工作进行方法论总结,从中学习优秀的方面,且取失败的教训。

很多人到了35岁会逐渐被后起之秀取代,因为他们不懂得学习,不思进取,固步自封。

他们认为自己有经验、有人脉,但是这些其他人也可以积累,甚至从你这里抢夺。只有你真正学到的东西是任何人都带不走的。

如果在职场中你只有一种能力不能丢弃,那就是学习的能力,它是你投资自己的根本。

③ 提升格局,为自己制订一份长期规划。

为什么现在很多职场讲师都在强调职业规划呢?因为一份有效的长期的职业规划能够帮助我们实现晋升加薪,并且长期保持竞争力。

很多人说自己无法努力工作的根本原因就是没兴趣,亦或者说“当兴趣变成工作的时候,那将会是另一种悲哀”。其实,这就是格局小的典型表现。

如果你因为做着不喜欢的工作而感到无望,那么你可能没有看到自己的大局,可能会任由自己被不喜欢的工作耗尽心力,而不是展望未来,规划下一步行动。

所以说,我需要有格局和规划的意识,才能经营好自己。职业规划的本质就是一份如何投资自己的计划清单,早早地制订这份清单,才能让自己不断精进。

三、不需要努力就能得到的,只有年龄

随着年龄的增长,我们会感觉越来越疲惫,因此开始懈怠,慢慢变得只会在工作中偷奸耍滑,再也无法为公司创造收益价值。

此时,不断增长的只有我们的年龄,我们的工作能力、知识眼界是慢慢退化的。

投资自己是一种心态。

等你有了投资自己的思维方式,你就不会感到受伤,感到失望,因为你将一切掌握在自己手中。

你是自己人生的掌舵人,取得成功全靠自己。你的价值完全由你自己决定,而不是某个某位上司或某家公司。

所谓投资自己,不过是怀揣梦想,心存希望,努力自律,奋勇前行。

总结

大型分布式系统犹如一个生命,系统中各个服务犹如骨骼,其中的数据犹如血液,而Kafka犹如经络,串联整个系统。这份Kafka源码笔记通过大量的设计图展示、代码分析、示例分享,把Kafka的实现脉络展示在读者面前,帮助读者更好地研读Kafka代码。

需要免费领取这份Kafka源码笔记的铁汁们,麻烦帮忙转发一下这篇文章+关注我,然后戳这里免费获取!

需要免费领取这份Kafka源码笔记的铁汁们,麻烦帮忙转发一下这篇文章+关注我,然后戳这里免费获取!

就这一次!拼多多内部架构师培训Kafka源码笔记(现已绝版)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java并发编程 背景介绍 并发历史 必要性 进程 资源分配的最小单位 线程 CPU调度的最小单位 线程的优势 (1)如果设计正确,多线程程序可以通过提高处理器资源的利用率来提升系统吞吐率 (2)建模简单:通过使用线程可以讲复杂并且异步的工作流进一步分解成一组简单并且同步的工作流,每个工作流在一个单独的线程中运行,并在特定的同步位置交互 (3)简化异步事件的处理:服务器应用程序在接受来自多个远程客户端的请求时,如果为每个连接都分配一个线程并且使用同步IO,就会降低开发难度 (4)用户界面具备更短的响应时间:现代GUI框架中大都使用一个事件分发线程(类似于中断响应函数)来替代主事件循环,当用户界面用有事件发生时,在事件线程中将调用对应的事件处理函数(类似于中断处理函数) 线程的风险 线程安全性:永远不发生糟糕的事情 活跃性问题:某件正确的事情迟早会发生 问题:希望正确的事情尽快发生 服务时间过长 响应不灵敏 吞吐率过低 资源消耗过高 可伸缩性较低 线程的应用场景 Timer 确保TimerTask访问的对象本身是线程安全的 Servlet和JSP Servlet本身要是线程安全的 正确协同一个Servlet访问多个Servlet共享的信息 远程方法调用(RMI) 正确协同多个对象中的共享状态 正确协同远程对象本身状态的访问 Swing和AWT 事件处理器与访问共享状态的其他代码都要采取线程安全的方式实现 框架通过在框架线程中调用应用程序代码将并发性引入应用程序,因此对线程安全的需求在整个应用程序中都需要考虑 基础知识 线程安全性 定义 当多个线程访问某个类时,这个类始终能表现出正确的行为,那么就称这个类是线程安全的 无状态对象一定是线程安全的,大多数Servlet都是无状态的 原子性 一组不可分割的操作 竞态条件 基于一种可能失效的观察结果来做出判断或执行某个计算 复合操作:执行复合操作期间,要持有锁 锁的作用 加锁机制、用锁保护状态、实现共享访问 锁的不恰当使用可能会引起程序性能下降 对象的共享使用策略 线程封闭:线程封闭的对象只能由一个线程拥有并修改 Ad-hoc线程封闭 栈封闭 ThreadLocal类 只读共享:不变对象一定是线程安全的 尽量将域声明为final类型,除非它们必须是可变的 分类 不可变对象 事实不可变对象 线程安全共享 封装有助于管理复杂度 线程安全的对象在其内部实现同步,因此多个接口可以通过公有接口来进行访问 保护对象:被保护的对象只能通过特定的锁来访问 将对象封装到线程安全对象中 由特定锁保护 保护对象的方法 对象的组合 设计线程安全的类 实例封闭 线程安全的委托 委托是创建线程安全类的最有效策略,只需要让现有的线程安全类管理所有的状态 在现有线程安全类中添加功能 将同步策略文档化 基础构建模块 同步容器类 分类 Vector Hashtable 实现线程安全的方式 将状态封装起来,对每个公有方法都进行同步 存在的问题 复合操作 修正方式 客户端加锁 迭代器 并发容器 ConcurrentHashMap 用于替代同步且基于散列的Map CopyOnWriteArrayList 用于在遍历操作为主要操作的情况下替代同步的List Queue ConcurrentLinkedQueue *BlockingQueue 提供了可阻塞的put和take方法 生产者-消费者模式 中断的处理策略 传递InterruptedException 恢复中断,让更高层的代码处理 PriorityQueue(非并发) ConcurrentSkipListMap 替代同步的SortedMap ConcurrentSkipListSet 替代同步的SortedSet Java 5 Java 6 同步工具类 闭锁 *应用场景 (1)确保某个计算在其需要的所有资源都被初始化后才能继续执行 (2)确保某个服务在其所依赖的所有其他服务都已经启动之后才启动 (3)等待知道某个操作的所有参与者都就绪再继续执行 CountDownLatch:可以使一个或多个线程等待一组事件发生 FutureTask *应用场景 (1)用作异步任务使用,且可以使用get方法获取任务的结果 (2)用于表示一些时间较长的计算 状态 等待运行 正在运行 运行完成 使用Callable对象实例化FutureTask类 信号量(Semaphore) 用来控制同时访问某个特定资源的操作数量,或者同时执行某个指定操作的数量 管理者一组虚拟的许可。acquire获得许可(相当于P操作),release释放许可(相当于V操作) 应用场景 (1)二值信号量可用作互斥体(mutex) (2)实现资源池,例如数据库连接池 (3)使用信号量将任何一种容器变成有界阻塞容器 栅栏 能够阻塞一组线程直到某个事件发生 栅栏和闭锁的区别 所有线程必须同时到达栅栏位置,才能继续执行 闭锁用于等待事件,而栅栏用于等待线程 栅栏可以重用 形式 CyclicBarrier 可以让一定数量的参与线程反复地在栅栏位置汇集 应用场景在并行迭代算法中非常有用 Exchanger 这是一种两方栅栏,各方在栅栏位置上交换数据。 应用场景:当两方执行不对称的操作(读和取) 线程池 任务与执行策略之间的隐形耦合 线程饥饿死锁 运行时间较长的任务 设置线程池的大小 配置ThreadPoolExecutor 构造参数 corePoolSize 核心线程数大小,当线程数= corePoolSize的时候,会把runnable放入workQueue中 如果队列满了,而且正在运行的线程数量大于或等于 maximumPoolSize,那么线程池会抛出异常,告诉调用者“我不能再接受任务了” keepAliveTime 保持存活时间,当线程数大于corePoolSize的空闲线程能保持的最大时间。 workQueue 保存任务的阻塞队列 如果正在运行的线程数量大于或等于 corePoolSize,那么将这个任务放入队列。如果这时候队列满了,而且正在运行的线程数量小于 maximumPoolSize,那么还是要创建线程运行这个任务 threadFactory 创建线程的工厂 handler 拒绝策略 unit 是一个枚举,表示 keepAliveTime 的单位(有NANOSECONDS, MICROSECONDS, MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS,7个可选值 线程的创建与销毁 管理队列任务 饱和策略 AbortPolicy DiscardPolicy DiscardOldestPolicy CallerRunsPolicy 线程工厂 在调用构造函数后再定制ThreadPoolExecutor 扩展 ThreadPoolExecutor afterExecute(Runnable r, Throwable t) beforeExecute(Thread t, Runnable r) terminated 递归算法的并行化 构建并发应用程序 任务执行 在线程中执行任务 清晰的任务边界以及明确的任务执行策略 任务边界 大多数服务器以独立的客户请求为界 在每个请求中还可以发现可并行的部分 任务执行策略 在什么(What)线程中执行任务? 任务按照什么(What)顺序执行(FIFO、LIFO、优先级)? 有多少个(How Many)任务能并发执行? 在队列中有多少个(How Many)任务在等待执行? 如果系统由于过载而需要拒绝一个任务,那么应该选择哪一个(Which)任务?另外,如何(How)通知应用程序有任务被拒绝? 在执行一个任务之前或之后,应该进行什么(What)动作? 使用Exector框架 线程池 newFixedThreadPool(固定长度的线程池) newCachedThreadPool(不限规模的线程池) newSingleThreadPool(单线程线程池) newScheduledThreadPool(带延迟/定时的固定长度线程池) 具体如何使用可以查看JDK文档 找出可利用的并行性 某些应用程序中存在比较明显的任务边界,而在其他一些程序中则需要进一步分析才能揭示出粒度更细的并行性 任务的取消和关闭 任务取消 停止基于线程的服务 处理非正常的线程终止 JVM关闭 线程池的定制化使用 任务和执行策略之间的隐性耦合 线程池的大小 配置ThreadPoolExecutor(自定义的线程池) 此处需要注意系统默认提供的线程池是如何配置的 扩展ThreadPoolExector GUI应用程序探讨 活跃度(Liveness)、性能、测试 避免活跃性危险 死锁 锁顺序死锁 资源死锁 动态的锁顺序死锁 开放调用 在协作对象之间发生的死锁 死锁的避免与诊断 支持定时的显示锁 通过线程转储信息来分析死锁 其他活跃性危险 饥饿 要避免使用线程优先级,因为这会增加平台依赖性,并可能导致活跃性问题。在大多数并发应用程序中,都可以使用默认的线程优先级。 糟糕的响应性 如果由其他线程完成的工作都是后台任务,那么应该降低它们的优先级,从而提高前台程序的响应性。 活锁 要解决这种活锁问题,需要在重试机制中引入随机性(randomness)。为了避免这种情况发生,需要让它们分别等待一段随机的时间 性能与可伸缩性 概念 运行速度(服务时间、延时) 处理能力(吞吐量、计算容量) 可伸缩性:当增加计算资源时,程序的处理能力变强 如何提升可伸缩性 Java并发程序中的串行,主要来自独占的资源锁 优化策略 缩

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值