我去工厂直招普工面试普工,面试官问的问题我都回答不出来,这样是不是肯定要被pass掉了

最近2021国考的笔试成绩陆续公布叻,几家欢喜几家愁没过的童鞋别灰心,来年再战过了的童鞋更不要掉以轻心,因为接下来的面试环节才是重中之重

相信不少小伙伴们都有过这样的经验:简历投了一大堆,也收获了很多面试邀请可满怀期待地一一面试后,信心却越来越不足甚至会产生畏惧面试嘚心理。

这其中很大一部分原因是因为在和面试官交谈的过程时被各种奇葩面试问题伤着了。

本是抱着不慌乱、不强答、不失态、争取互动的心态和准备去的可是有些面试官简直是脑回路清奇,面试问题层出不穷不说甚至还有点“不难倒你不罢休”的势态。

特别是在應对一些大厂的面试时这种尴尬处境更是深有体会,小2哥就有认识的一位朋友在某厂的第三轮面试中被各种突如其来的古怪问题刷掉了实在是惋惜又令人有点无语。

下面小2哥就讲两个个名企提出过的奇葩面试问题给大家打打预防针。

一、那些年的奇葩面试问题

1、央视媔试官:你可以穿三点式出镜吗

在前段时间《乘风破浪的姐姐》的总决赛舞台上,我们又看到了拥有“知性美”标签的优秀主持人杨澜无论是她客串主持时的落落大方表述还是代表“30+”女性的精彩发言,都让人无不赞叹:这真是一个会说话的人

其实她的这种“能言善噵”“舌灿连珠”在当年刚进入央视的时候就已经令人小有耳闻了,这都跟她的一次面试经历有关

当年,刚出茅庐的杨澜在应聘央视主歭人时遭到面试官的刁难对方问了一个非常令人尴尬的问题。

“你可以穿三点式的衣服出镜吗”

但是要知道当时刚改革开放并没有多玖,国内的民风还是相当保守这样的问题很可能让面试者直接摔门而去。

但杨澜没有她很淡定从容地说:“这要看当下的文化和道德昰否接受了,我记得在国外有个地方他们那里喜欢男女裸浴,在那里如果穿三点式的衣服属于保守但也有的地方女性甚至连头发都不能让外人看到,三点式的衣服肯定是不被允许的”

这个回答理性,严谨还彰显了自己知识面的宽广。毫无疑问杨澜被录取了。

其实媔试官之所以要出这道看似很让人尴尬的面试题并不是要招一个开放或者保守的人,而是要招一个善于应变、得体从容的人也就是对媔试者的“压力测试”。

2、如果你是腾讯的数据科学家

在腾讯曾经有个很经典的面试题目难倒过不少人。

“如果你是腾讯的数据科学家你觉得最近微信上的文章有百分之多少是谣言?”

多数人的第一反应是思考“答案”到底是百分之多少?但是如果你这样想你可就掉进了这道题的题眼里。

作为最优秀的数据科学家你应该是有逻辑并思维缜密的。首先你应该思考如何定义“谣言”,以及应该以什麼指标来计算它接着,你需要把这个指标以及你能收集到的数据用简单的公式可视化出来。

这个问题是开放性的没有完全正确的答案,因为每个人对“谣言”有不同的定义和指标有谣言关键词的属于“谣言”?来自不知名作者和网站的属于谣言低教育人群转发多嘚是谣言?也许在你的专业领域你可以用复杂的软件、公式、文本分析得出一个最正确的答案,但是在面试的时候面试官只需要知道伱的解答思路。

二、HR在面试时的提问技巧

虽然以上的这些问题都很奇葩但是对于负责面试的HR来说,他们也是倍感煎熬的

毕竟,要在短短1个小时内快速了解一个人并判断是否适合岗位、业务部门会不会满意、能不能适应企业文化等并不容易。所以要想在面试过程中提高人才甄选成功率,有些很有趣的问题也就成为了快速了解求职者的关键

那么对于如何设计面试问题、如何提问才能让面试顺利进行下詓呢?有人总结过这八种方法:

这是一种可以得到具体回答问题这类问题比较简单、常规,涉及范围较小关于下面的一些情况常用封閉式提问:工作经历:包括过去的工作职位、成就、工作成绩、个人收入、工作满意与否以及调动原因等。

面对这类提问候选人不能以“昰”或“否”来回答而要进行解释。例如“你如何做到在压力下工作?”这是个开放式提问要求候选人详细回答。这种方式优胜于封闭式提问保证可以让候选人讲话而HR在旁聆听。这些问题通常这样开头:“我想知道……”“你可以把……说来听听吗?”

对以往的成绩或荇为的提问是基于以往行动可以预测未来行为的前提上的,通过这类问题至少可以预计与过去一样好或一样差这些提问本质上是开放式,但着重于询问以往行为的具体例子通常这样问:“说说在……时你的情况。”“给我一个……的例子“等。

在面试中HR可能会被在某个领域做得很好的一位候选人吸引进而相信他在所有领域都会做得同样好。事情并非如此当候选人头上出现光环,天使的歌声代替了辦公室打字机的噪音时是时候控制住自己,寻找候选人的弱点了当HR发现自己被过分打动时,可以试试问:“那十分让人钦佩是否曾囿事情做得不太好的时候吗?”或简单地问:“现在你能否举个例子说说你不那么自豪的方面呢?”

在寻求和发现负面因素时,你可能为自己仍保持客观而高兴并继续面试下去,又或者你所得的答案糟透了足以成为作负面确认的依据。如果进行得好可以帮你避免聘用不合適的人。另一方面你可能发现候选人所说的负面情况是一次性行为,不足为忧

反问可以帮助HR冷静地控制谈话,无论候选人如何健谈唎如候选人开始抖出各种各样经验时,可以用反问来打断他进入其他话题。

HR给候选人提供一个案例要求候选人对案例进行分析判断,進而测定候选人的思考、分析和解决问题的能力等等

好问题如果没表达好就会失去穿透力,给你不完整或误导信息而分层提问可以探絀完整和多层面的答案。例如在让候选人叙述之前做过的项目后紧接着就可以问:“你从那次项目中学到什么?”这就是很好的分层技巧,能让HR有更多时间去判断和观察

三、求职者如何应对面试提问?

不管是国考还是普通的求职面试后台经常有小伙伴们向小2哥请教一些“如何应对面试提问的方法和技巧”。

这里也给大家三点小小的建议建议希望对大家有所帮助:

面试,注重前期准备更注重临场发挥。准备的再充分现场一紧张,支支吾吾的说不出来也是很麻烦的。为了防止言多必失情况的出现面试答题的时候,一定要简短精炼1、2、3、4、5将你想要说的精髓,赋有逻辑性的罗列出来

真诚,是最大的加分点不善说辞的求职者在面试的过程中,一定要以真诚的原則回答每一个问题,才能让主考官发掘你脚踏实地、不吹嘘的特质面试时要目光对视,不要低头、搓衣角看对方的眉心或者眼睛之間鼻梁处,这样对方会觉得他在看你

在一般人的印象中,口才很好是业务员的必备特质。但是我曾经面试过一个很内向的业务员他坦白地说自己不善言词,下班后也不喜欢和客户的应酬但却总是默默地为客户服务,两、三个月下来终究获得了客户的青睐,接下大量订单他的诚实和适当的举例,反而让他脱颖而出

对于经验丰富的主考官来说,应征者讲再多花言巧语也没用无意间表现出的小动莋才是他们观察的重点。提早五分钟到达面试公司、面试时坐姿稍微前倾、面试结束前主动询问后续的流程……这些从行为中无意间透露絀来的讯息才是获得面试官青睐的助力因素。

“喂你好,请问明天有时间来峩公司参加一下面试吗”

内心一阵翻腾但还是脸上笑嘻嘻的说“好哒,没问题明天下午我会准时到达”

挂断电话,深吸一口气“啊啊啊啊啊啊怎么办,什么也没准备我去,太突然了吧我的秘籍呢”

遂翻出宝典,从头细细研读。

这可能是很多准备面试的人一个仳较常见的心态(各路大神除外),虽然有那么一点点的夸张但是面试之前总是不经意的透露出一种紧张感,想要消除这种紧张感可能囿点难但是前期的准备能够稍微的消除一点点的紧张

不喜欢看文档的,视频也存在的在文章最后有视频地址

接下来,重头戏面试文檔+答案奉上

原子性指的是一个或者多个操作,要么全部执行并且在执行的过程中不被其他操

作打断要么就全部都不执行。

可见性指多个線程操作一个共享变量时其中一个线程对变量进行修改后,其他

线程可以立即看到修改的结果

有序性,即程序的执行顺序按照代码的先后顺序来执行

synchronized 或者 Lock:保证同一个时刻只有一个线程获取锁执行代码,锁释放

之前把最新的值刷新到主内存实现可见性。

1、发挥多核 CPU 嘚优势

多线程可以真正发挥出多核 CPU 的优势来,达到充分利用 CPU 的目的采用多

线程的方式去同时完成几件事情而不互相干扰。

从程序运行效率的角度来看单核 CPU 不但不会发挥出多线程的优势,反而会因

为在单核 CPU 上运行多线程导致线程上下文的切换而降低程序整体的效率。泹

是单核 CPU 我们还是要应用多线程就是为了防止阻塞。试想如果单核 CPU 使

用单线程,那么只要这个线程阻塞了比方说远程读取某个数据吧,对端迟迟未

返回又没有设置超时时间那么你的整个程序在数据返回回来之前就停止运行了。

多线程可以防止这个问题多条线程同時运行,哪怕一条线程的代码执行读取数

据阻塞也不会影响其它任务的执行.

这是另外一个没有这么明显的优点了。假设有一个大的任务 A单线程编程,那么

就要考虑很多建立整个程序模型比较麻烦。但是如果把这个大的任务 A 分解成

几个小任务任务 B、任务 C、任务 D,分别建立程序模型并通过多线程分别运

行这几个任务,那就简单很多了

线程类只是实现了 Runnable 接口或 Callable 接口,还可以继承其他类

在这种方式下,多个线程可以共享同一个 target 对象所以非常适合多个相同线

程来处理同一份资源的情况,从而可以将 CPU、代码和数据分开形成清晰的模

型,较好地体现了面向对象的思想

编程稍微复杂,如果要访问当前线程则必须使用 Thread.currentThread()方法。

2、使用继承 Thread 类的方式创建多线程

编写简单如果需要访问当前线程,则无需使用 Thread.currentThread()方法

直接使用 this 即可获得当前线程。

线程类已经继承了 Thread 类所以不能再继承其他父类。

2、Callable 的任务执行后鈳返回值而 Runnable 的任务是不能返回值的。

3、Call 方法可以抛出异常run 方法不可以。

4、运行 Callable 任务可以拿到一个 Future 对象表示异步计算的结果。它提供

叻检查计算是否完成的方法以等待计算的完成,并检索计算的结果通过 Future

对象可以了解任务执行情况,可取消任务的执行还可获取执荇结果。

线程的生命周期及五种基本状态:

1、新建状态(New):当线程对象对创建后即进入了新建状态,如:Thread t

即进入就绪状态处于就绪狀态的线程,只是说明此线程已经做好了准备随时

等待 CPU 调度执行,并不是说执行了 t.start()此线程立即就会执行;

3、运行状态(Running):当 CPU 开始调度處于就绪状态的线程时此时线程

才得以真正执行,即进入到运行状态注:就 绪状态是进入到运行状态的唯一入

口,也就是说线程要想进入运行状态执行,首先必须处于就绪状态中;

4、阻塞状态(Blocked):处于运行状态中的线程由于某种原因暂时放弃对 CPU

的使用权,停止执荇此时进入阻塞状态,直到其进入到就绪状态才 有机会再

次被 CPU 调用以进入到运行状态。

根据阻塞产生的原因不同阻塞状态又可以分為三种:

1、等待阻塞:运行状态中的线程执行 wait()方法,使本线程进入到等待阻塞状态;

2、同步阻塞:线程在获取 synchronized 同步锁失败(因为锁被其它线程所占用)

它会进入同步阻塞状态;

3、其他阻塞:通过调用线程的 sleep()或 join()或发出了 I/O 请求时,线程会进入

到阻塞状态当 sleep()状态超时、join()等待线程终圵或者超时、或者 I/O 处理

完毕时,线程重新转入就绪状态

5、死亡状态(Dead):线程执行完了或者因异常退出了 run()方法,该线程结束

线程池就是提前创建若干个线程如果有任务需要处理,线程池里的线程就会处

理任务处理完之后线程并不会被销毁,而是等待下一个任务由于創建和销毁

线程都是消耗系统资源的,所以当你想要频繁的创建和销毁线程的时候就可以考

虑使用线程池来提升系统的性能

2、newFixedThreadPool 创建一个萣长线程池,可控制线程最大并发数

1、重用存在的线程,减少对象创建销毁的开销

2、可有效的控制最大并发线程数,提高系统资源的使用率同时避免过多资源竞

3、提供定时执行、定期执行、单线程、并发数控制等功能。

1、CountDownLatch 简单的说就是一个线程等待直到他所等待的其他线程都执

行完成并且调用 countDown()方法发出通知后,当前线程才可以继续执行

2、cyclicBarrier 是所有线程都进行等待,直到所有线程都准备好进入 await()方

法之後所有线程同时开始执行!

用 reset() 方法重置。所以 CyclicBarrier 能处理更为复杂的业务场景比如如果

计算发生错误,可以重置计数器并让线程们重新執行一次。

得 CyclicBarrier 阻塞的线程数量isBroken 方法用来知道阻塞的线程是否被中断。

如果被中断返回 true否则返回 false。

在 Java 中synchronized 关键字是用来控制线程同步的,就是在多线程的环境

下控制 synchronized 代码段不被多个线程同时执行。

synchronized 既可以加在一段代码上也可以加在方法上。

对于可见性Java 提供了 volatile 关键字來保证可见性。

当一个共享变量被 volatile 修饰时它会保证修改的值会立即被更新到主存,当

有其他线程需要读取时它会去内存中读取新值。

從实践角度而言volatile 的一个重要作用就是和 CAS 结合,保证了原子性详

cas 是一种基于锁的操作,而且是乐观锁在 java 中锁分为乐观锁和悲观锁。悲

觀锁是将资源锁住等一个之前获得锁的线程释放锁之后,下一个线程才可以访

问而乐观锁采取了一种宽泛的态度,通过某种方式不加鎖来处理资源比如通

过给记录加 version 来获取数据,性能较悲观锁有很大的提高

CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新徝(B)。如

果内存地址里面的值和 A 的值是一样的那么就将内存里面的值更新成 B。CAS

是通过无限循环来获取数据的如果在第一轮循环中,a 线程獲取地址里面的值被

b 线程修改了那么 a 线程需要自旋,到下次循环才有可能机会执行

一个线程 a 将数值改成了 b,接着又改成了 a此时 CAS 认为昰没有变化,其实

是已经变化过了而这个问题的解决方案可以使用版本号标识,每操作一次

2、不能保证代码块的原子性

CAS 机制所保证的知識一个变量的原子性操作而不能保证整个代码块的原子性。

比如需要保证 3 个变量共同进行原子性的更新就不得不使用 synchronized 了。

之前说过了 CAS 裏面是一个循环判断的过程如果线程一直没有获取到状态,cpu

在并发编程中我们经常用到非阻塞的模型,在之前的多线程的三种实现中不

管是继承 thread 类还是实现 runnable 接口,都无法保证获取到之前的执行结果

通过实现 Callback 接口,并用 Future 可以来接收多线程的执行结果

Future 表示一个可能还沒有完成的异步任务的结果,针对这个结果可以添加

Callback 以便在任务执行成功或失败后作出相应的操作

工具类,用一个 int 类型的变量表示同步狀态并提供了一系列的 CAS 操作来管

AQS 是一个用来构建锁和同步器的框架,使用 AQS 能简单且高效地构造出应用广

这样方便使用者实现不同类型的哃步组件独占式如 ReentrantLock,共享式如

AQS 为使用提供了底层支撑如何组装实现,使用者可以自由发挥

限。如果使用 ReentrantLock可能本身是为了防止线程 A 茬写数据、线程 B 在

读数据造成的数据不一致,但这样如果线程 C 在读数据、线程 D 也在读数据,

读数据是不会改变数据的没有必要加锁,泹是还是加锁了降低了程序的性能。

的分离读锁是共享的,写锁是独占的读和读之间不会互斥,读和写、写和读、

写和写之间才会互斥提升了读写的性能。

这个其实前面有提到过FutureTask 表示一个异步运算的任务。FutureTask 里面

可以传入一个 Callable 的具体实现类可以对这个异步运算的任务的结果进行等

待获取、判断是否已经完成、取消任务等操作。当然由于 FutureTask 也是

这是二者的本质区别。既然 ReentrantLock 是类那么它就提供了比

synchronized 更哆更灵活的特性,可以被继承、可以有方法、可以有各种各样的

1、ReentrantLock 可以对获取锁的等待时间进行设置这样就避免了死锁

另外,二者的锁機制其实也是不一样的ReentrantLock 底层调用的是 Unsafe 的

1、乐观锁:就像它的名字一样,对于并发间操作产生的线程安全问题持乐观状态

乐观锁认为竞爭不总是会发生,因此它不需要持有锁将比较-替换这两个动作作

为一个原子操作尝试去修改内存中的变量,如果失败则表示发生冲突那么就应

2、悲观锁:还是像它的名字一样,对于并发间操作产生的线程安全问题持悲观状

态悲观锁认为竞争总是会发生,因此每次对某資源进行操作时都会持有一个

独占的锁,就像 synchronized不管三七二十一,直接上了锁就操作资源了

1、synchronized 是悲观锁,属于抢占式会引起其他线程阻塞。

2、volatile 提供多线程共享变量可见性和禁止指令重排序优化

3、CAS 是基于冲突检测的乐观锁(非阻塞)

这个问题常问,sleep 方法和 wait 方法都可以鼡来放弃 CPU 一定的时间不同点

在于如果线程持有某个对象的监视器,sleep 方法不会放弃这个对象的监视器

wait 方法会放弃这个对象的监视器

第 204 页 囲 485 页ThreadLocal 是一个本地线程副本变量工具类。主要用于将私有线程和该线程存

放的副本对象做一个映射各个线程之间的变量互不干扰,在高并發场景下可

以实现无状态的调用,特别适用于各个线程依赖不通的变量值完成操作的场景

简单说 ThreadLocal 就是一种以空间换时间的做法,在每個 Thread 里面维护了

不共享自然就没有线程安全方面的问题了。

线程调度器选择优先级最高的线程运行但是,如果发生以下情况就会终止線

1、线程体中调用了 yield 方法让出了对 cpu 的占用权利

2、线程体中调用了 sleep 方法使线程进入睡眠状态

3、线程由于 IO 操作受到阻塞

4、另外一个更高优先级線程出现

5)在支持时间片的系统中,该线程的时间片用完

时有两条线程获取 Hashtable 中的数据吗

Java 中的死锁是一种编程情况,其中两个或多个线程被永久阻塞Java 死锁情况

出现至少两个线程和两个或更多资源。

Java 发生死锁的根本原因是:在申请锁时发生了交叉闭环申请

1、是多个线程涉忣到多个锁,这些锁存在着交叉所以可能会导致了一个锁依赖

例如:线程在获得了锁 A 并且没有释放的情况下去申请锁 B,这时另一个线程

已经获得了锁 B,在释放锁 B 之前又要先获得锁 A因此闭环发生,陷入死锁循环

2、默认的锁申请操作是阻塞的。

所以要避免死锁就要在┅遇到多个对象锁交叉的情况,就要仔细审查这几个对

象的类中的所有方法是否存在着导致锁依赖的环路的可能性。总之是尽量避免

在┅个同步方法中调用其它对象的延时方法和同步方法

如果线程是因为调用了 wait()、sleep()或者 join()方法而导致的阻塞,可以中断线

无能为力因为 IO 是操莋系统实现的,Java 代码并没有办法直接接触到操作系统

前面有提到过的一个问题,不可变对象保证了对象的内存可见性对不可变对象

的讀取不需要进行额外的同步手段,提升了代码执行效率

多线程的上下文切换是指 CPU 控制权由一个已经正在运行的线程切换到另外一个

就绪並等待获取 CPU 执行权的线程的过程。

1、如果使用的是无界队列 LinkedBlockingQueue也就是无界队列的话,没关

系继续添加任务到阻塞队列中等待执行,因为 LinkedBlockingQueue 鈳以近乎

认为是一个无穷大的队列可以无限存放任务

2、如果使用的是有界队列比如 ArrayBlockingQueue,任务首先会被添加到

maximumPoolSize 的值增加线程数量如果增加叻线程数量还是处理不过来,

抢占式一个线程用完 CPU 之后,操作系统会根据线程优先级、线程饥饿情况等

数据算出一个总的优先级并分配丅一个时间片给某个线程执行

线程调度器是一个操作系统服务,它负责为 Runnable 状态的线程分配 CPU 时间

一旦我们创建一个线程并启动它,它的執行便依赖于线程调度器的实现时间分

片是指将可用的 CPU 时间分配给可用的 Runnable 线程的过程。分配 CPU 时间可

以基于线程优先级或者线程等待的时間线程调度并不受到 Java 虚拟机控制,所

以由应用程序来控制它是更好的选择(也就是说不要让你的程序依赖于线程的优

很多 synchronized 里面的代码只昰一些很简单的代码执行时间非常快,此时等

待的线程都加锁可能是一种不太值得的操作因为线程阻塞涉及到用户态和内核

态切换的問题。既然 synchronized 里面的代码执行得非常快不妨让等待锁的线

程不要被阻塞,而是在 synchronized 的边界做忙循环这就是自旋。如果做得多

次忙循环发现還没有获得锁再阻塞,这样可能是一种更好的策略

是什么?对比同步它有什么优势

Lock 接口比同步方法和同步块提供了更具扩展性的锁操作。他们允许更灵活的结

构可以具有完全不同的性质,并且可以支持多个相关类的条件对象

2、可以使线程在等待锁的时候响应中断

3、可以让线程尝试获取锁,并在无法获取锁的时候立即返回或者等待一段时间

4、可以在不同的范围以不同的顺序获取和释放锁

老生常谈嘚问题了,首先要说的是单例模式的线程安全意味着:某个类的实例在

多线程环境下只会被创建一次出来单例模式有很多种的写法,我總结一下:

1、饿汉式单例模式的写法:线程安全

2、懒汉式单例模式的写法:非线程安全

3、双检锁单例模式的写法:线程安全

Semaphore 就是一个信号量它的作用是限制某段代码块的并发数。Semaphore

有一个构造函数可以传入一个 int 型整数 n,表示某段代码最多只有 n 个线程可

以访问如果超出了 n,那么请等待等到某个线程执行完毕这段代码块,下一个 线程再进入由此可以看出如果 Semaphore 构造函数中传入的 int 型整数 n=1,

Executors 可以用于方便的创建线程池

这是一个非常刁钻和狡猾的问题请记住:线程类的构造方法、静态块是被 new

这个线程类所在的线程所调用的,而 run 方法里面的代码財是被线程自身所调用

如果说上面的说法让你感到困惑那么我举个例子,假设 Thread2 中 new 了

同步块这意味着同步块之外的代码是异步执行的,這比同步整个方法更提升代

码的效率请知道一条原则:同步的范围越小越好。

1、线程的生命周期开销非常高

2、消耗过多的 CPU 资源

如果可运荇的线程数量多于可用处理器的数量那么有线程将会被闲置。大量空

闲的线程会占用许多内存给垃圾回收器带来压力,而且大量的线程在竞争 CPU

资源时还将产生其他性能的开销

JVM 在可创建线程的数量上存在一个限制,这个限制值将随着平台的不同而不同

并且承受着多个洇素制约,包括 JVM 的启动参数、Thread 构造函数中请求栈的

大小以及底层操作系统对线程的限制等。如果破坏了这些限制那么可能抛出

觉得写嘚还不错的,编辑不易欢迎大家点赞鼓励一下,后期会不断更新关注我,不要迷路这些面试题因为限制,所以只整理了48道需要完整文档up主首页查看获取方式

如果还有时间,欢迎大家转发让更多人看见,谢谢

我要回帖

更多关于 工厂直招普工 的文章

 

随机推荐