《Java多线程编程核心技术》

一、线程中断判断:
  • interrupted
public static boolean interrupted()
  • isInterrupted

public boolean isInterrupted()ide


二、synchronized详解:
(1)加了synchronized的地方会同步阻塞,其余的线程依然能够访问没有加synchronized的地方,能够保证原子性,也能够将线程工做内存的私有变量和公共内中的变量同步
(2)锁对象相同,就同步;不一样就不一样步;锁对象的属性改变,不影响锁的效果。
(3)锁this的时候,锁的是当前对象。
(4)锁static的时候,锁的是整个.class,这个的范围比较大。
(5)同步不能被继承
(6)出现异常的时候,锁会自动释放
(7)存在父子类继承关系的时候,子类能够经过“可重入锁”调用父类的同步方法

三、volatile详解:
(1)只保证数据的可见性,不能保证数据的原子性;
(2)会强制将公共内存的变量刷新到线程的工做内存当中;

四、全局变量通常存在于公共堆栈和线程的私有堆栈中,若是当JVM被设置为-server模式的时候,为了提升线程的运行效率,线程会一直在私有的堆栈中取值,全部使用volatile来实现变量可见性

五、Condition详解
一、condition.await()方法调用以前要先调用lock.lock()方法来获取到同步监视器
二、建立Condition的对象:
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
三、把线程放到指定的组里面就能够唤醒指定的线程
Object类的wait()方法至关于Condition类中的await()方法。
Object类中的wait(long timeout) 方法至关于Condition类中的await(long time,TimeUnit unit)方法。
Object类中的notify()方法至关于Condition中的signal()方法。
Object类中的notifyAll()方法至关于Condition类中的signalAll()方法。

六、Timer详解
(1)(重要!)TimerTask是以队列的方式一个一个被顺序性执行,因此执行的时间有可能和预期的时间不一致,由于前面的任务有可能消耗的时间比较长,则后面的任务的运行时间也被延后。若是是心跳周期执行,线程执行时间较长时候,下一次的心跳执行将会延后!
(2)TimerTask类的cancel()方法是将本身从任务队列中清除;Timer中的cancel()方法的做用是将任务队列中的所有任务清除(Timer的cancel()要注意,要该方法抢到queue锁以后才会结束任务,不然任务会正常执行)。
(3)schedule 和 scheduleAtFixedRate 方法在周期心跳执行的时候,
(3.1)若是任务不延迟,那么下一次任务的执行的开始时间是:上一次任务的开始时间 + period(心跳周期);
(3.2)若是任务延迟了,那么下一次任务的开始执行时间是:上一次任务的结束时间做为参考计算。
(3.4)schedule 和 scheduleAtFixedRate的区别不大,一个小区别是:
schedule 不具备追赶性,好比提早执行的时候,提早时间和当前时间之间的任务不被执行;
scheduleAtFixedRate具备追赶性,好比提早执行的时候,提早时间和当前时间之间的任务会被“补充性”的执行;

七、join详解:
(1)方法join具备使线程排队运行的做用,有点相似同步运行的效果
(2)在join过程当中,若是当前线程对象被中断,则当前线程出现异常
(3) 方法join(long)的功能在内部使用的是wait(long)方法来实现,因此join(long)方法具备释放锁的特色。

八、方法wait()锁释放与notify()锁不释放
(1)当wait()方法被执行后,锁自动释放; 可是执行完notify()方法,锁不自动释放,须要执行万notify()所在的synchronized同步代码块后,锁才释放。
(2)wait()方法和notify()方法在调用以前,线程必须得到该对象的对象级别锁。

九、程序调用suspend方法将线程挂起,此方法容易致使死锁,不是建议使用