这篇文章是研一刚入学时写的,本日整理草稿时才被我挖出来。其时地痞沌沌的口试,记下来了一些并发的口试问题,软件开发,许多还没有答复。到此刻也进修了不少并发的常识,软件开发,回过甚来看这些问题和其时整理的谜底,裂痕百出又十分好笑。颁发出来权当对本身的一个提醒——假如不能一直进步,你就看不到当初傻逼的本身。
曾经,我在口试Java研发实习生时最常听到的一句话就是:
搞Java怎么能不学并发呢?
没错,真的是颠末尾口试官的无数藐视,我才知道Java并发编程在Java语言中的重要性。
并发模子
灰心锁和乐观锁的领略及如何实现,有哪些实现方法?
灰心锁
灰心锁假设最坏的环境(假如你不锁门,那么作怪鬼就会冲入并搞得一团糟),而且只有在确保其他线程不会滋扰(通过获取正确的锁)的环境下才气执行下去。
常见实现如独有锁等。
安详性更高,但在中低并发水平下的效率更低。
乐观锁
乐观锁借助斗嘴查抄机制来判定在更新进程中是否存在其他线程的滋扰,假如存在,这个操纵将失败,而且可以重试(也可以不重试)。
常见实现如CAS等。
部门乐观锁减弱了一致性,但中低并发水平下的效率大大提高。
并发编程
Java中如何建设一个线程
从面相接口的角度上讲,实际上只有一种要领实现Runable接口;但Thread类为线程操纵提供了更多的支持,所以凡是做法是实现Runable接口,实例化并传入Thread类的结构函数。
Vector(HashTable)如何实现线程安详
通过synchronized要害字修饰每个要领。
依据synchronized要害字引申出以下问题。
synchronized修饰要领和修饰代码块时有何差异
持有锁的工具差异:
从而导致二者的意义差异:
ConcurrentHashMap的如何实现线程安详
ConcurrentHashMap的线程安详实现与HashTable差异:
Java中有哪些实现并发编程的要领
要从最简朴的答起,业界最常用的是重点,有新意就放在最后。
1. synchronized要害字
2. 利用担任自Object类的wait、notify、notifyAll要领
3. 利用线程安详的API和荟萃类:
4.利用原子变量、volatile变量等
5. 利用Concurrent包中提供的信号量Semaphore、闭锁Latch、栅栏Barrier、互换器Exchanger、Callable&Future、阻塞行列BlockingQueue等.
6. 手动利用Lock实现基于锁的并发节制
7. 手动利用Condition或AQS实现基于条件行列的并发节制
8. 利用CAS和SPIN等实现非阻塞的并发节制
利用稳定类
9. 其他并发模子还没有涉及
从而引申出如下问题:
synchronized修饰要领和修饰代码块时有何差异(见前)
信号量Semaphore、闭锁Latch、栅栏Barrier、互换器
Exchanger、Callable&Future、阻塞行列BlockingQueue的实现道理
ConcurrentLinkedQueue的插入算法
算法焦点可归纳综合为两步:
具体待增补。
参考:
在java中wait和sleep要领的差异?
最大的差异是在期待时wait会释放锁,而sleep一直持有锁。Wait凡是被用于线程间交互,sleep凡是被用于暂停执行。
为什么wait, notify 和 notifyAll这些要领不在thread类内里?