怎么算熟悉多线程编程
怎么算熟悉多线程编程
JAVA版本
不同平台提供的工具很不一样,看公司要求。关键还是要了解原理。下面的案例差不多是6家左右要求多线程熟练的公司应聘的总结。
- 了解进程线程的基本概念,能用一种语言在一个平台上实现一个多线程的例子。(这些不会还写熟悉多线程就太大无畏了)
- 了解为什么要用Mutex之类的工具做锁来同步和保护资源。弄懂诸如racing condition,死锁之类的概念。50%公司的见面题,用来砍死大无畏。
- 了解编译器优化带来的影响,了解cache的影响,了解volatile,memory barrier之类的概念。如果是主Java的话,去了解一下JVM的内存模型。以上这些偏硬偏系统端的公司喜欢问,不过由于太基础,稍稍好奇一点的多线程领域程序员都应该会了解,否则略显大无畏。
- 了解一下你主攻平台+语言所提供的工具库,知道常用的工具的用法和使用场景:Mutex,Semaphore,原子操作集,Condition Variable,spin lock。这几个算是比较常用的,在各个平台+语言也都有对应实现。老实说,spinlock,condition variable是我工作里从没用过的,但是也被问过,其他几个都太常用了,如果是java的话再多看一组Executor相关的,以及Java多线程相关的keywords,和object本身提供的同步函数,wait notify之类的,在主Java的公司问过。
- 了解常用的多线程设计范式,比如读写锁(Reader/Writer Lock,非常经典的范式,有偏向读和写的不同变形,至少被要求写过3次),生产消费范式(写过2次),一些常用容器的实现,比如BlockingQueue(写过3次)或者concurrentHashmap(写过2次)。如果是主Java的话可以看看JDK的实现。熟悉一下一些算不上多线程设计模式的小技巧,比如传递只读对象可以避免加锁,或者Copy传递以防外部修改之类的(讨论环节被问过)。另外值得特别一提的一个小细节是,Singleton的线程安全是个很有意思而且容易出错的话题,值得一看(只被问过一次,不过我答挂了,所以印象及其深)。还有可能会问的是一些有趣的小场景让你实现一些功能需要线程安全,无法特别准备,但是你能了解上面说的这些范式,不傻的话大多数都能想出来。
如果和我一样多线程方面是主Java的话,记得Doug Lea的书写的很明白,不过不记得当时读完的是哪本,70%可能是下面这个Java-Concurrency-Practice-Brian-Goetz。否则就是Concurrent Programming in Java: Design Principles and Pattern (2nd Edition): Doug Lea: 0785342310092: Amazon.com: Books
这个大致是一些公司对多线程部分的要求,如果应聘者声称熟悉这个部分。上面所有点都是本人面试被问到的,基本上能看完上面这些,可以做到不用很心虚在简历上写自己熟悉多线程而不会被揭穿。
并发的问题
多线程有什么好熟悉的,只是一个过度定型的模式。多线程要解决的问题说到底只有一个,如何并发,包括共享资源和最大化利用资源两种。而并发本身是真实世界的本原,也是事物/问题可以通过细分独立再关联成为一个整体的固有特性。
在计算中模拟并发的基本手段是调度,而多线程就是抢占式调度模式在编程语言下的具体特征。这么说你就知道多线程本身是怎么回事。
至于其他问题,都是源于并发自身,就是如何高效的同步,如何访问共享资源不发生冲突,如何解决共享资源的释放或者叫所有权问题,以及避免使用一些手段解决这些问题时可能导致的一些其他问题,比如死锁等等。
总之,困难的是并发本身,而不是什么多线程,虽然目前的编程模式都过度的甚至是错误的把前者嫁接在后者之上。
检验
第一,明白进程和线程的基本概念
第二,明白保护线程安全的基本方法有哪些
第三,明白这些线程安全的方法,包括互斥锁,自旋锁,无锁编程的适用的业务场景是什么?从OS和硬件角度说说原理是怎么样的?开销在哪里?
第四,能在现场借助cas操作,风险指针实现无锁的数据结构,比如无锁栈,无锁环形队列。无锁排序链表
浙公网安备 33010602011771号