继续面试大纲系列文章。java
这是多线程的第二篇。面试
多线程就像武学中对的吸星大法,理解透了用好了能够得道成仙,俯瞰芸芸众生;而滥用则会遭其反噬。编程
在多线程编程中要渡的第二个“劫”,则是Lock。在不少时候,包括面试、包括实际项目应用,咱们都会拿来和synchronized对比一番。安全
咱们知道,多线程的核心思想是经过增长线程数量来并发的运行,来提升效率,也就是数量决胜论,而不是质量决胜(提升每一个线程的处理能力)。多线程编程中面临的最大挑战,是如何解决多个线程同时修改一个公用的变量所带来的变量值不肯定性问题。顺着这个思路分析,经常使用办法,无非就是,要么对变量动手,在一个线程修改时,变量值被锁定。要么是对修改的操做动手,在该段代码执行时,对其加锁,其余线程不能够在同一时刻进入该段代码执行。多线程
同synchronized同样,Lock,也是实现了后一种办法。只不过,实现方式,有所不一样。并发
public class Mutex implements Lock { // 静态内部类,自定义同步器 private static class Sync extends AbstractQueuedSynchronizer{ // 该方法用于判断当前锁是否在独占模式下被占用状态 protected boolean isHeldExclusively(){ return getState() == 1; } // 获取锁!!! public boolean tryAcquire(int acquires){
//典型的CAS原子操做,若是初始状态为0,能够得到锁 if (compareAndSetState(0, 1)){ setExclusiveOwnerThread(Thread.currentThread()); return true; } return false; } //释放锁,将当前状态设置为0 protected boolean tryRelease(int releases){ if (getState() == 0){ throw new IllegalMonitorStateException(); } setExclusiveOwnerThread(null); setState(0); return true; } // 返回一个Condition,每一个condition都包含了一个condition队列 ,这个后续再说 Condition newCondition(){ return new ConditionObject(); } }
4.扩展:Condition,多路通知机制 ui
欢迎扫描如下二维码关注公众号:小端有话说:spa