1:blocked线程和waiting的线程的区别? 如何唤醒?java
java线程中含有waiting与blocked两种状态:编程
线程的 blocked状态每每是没法进入同步方法/代码块来完成的(BLOCKED是指线程正在等待获取锁)。这是由于没法获取到与同步方法/代码块相关联的锁。多线程
WAITING是指线程正在等待其余线程发来的通知(notify),收到通知后,可能会顺序向后执行(RUNNABLE),也可能会再次获取锁,进而被阻塞住(BLOCKED)。(有几种状况致使WAITING状态呢?: 本身call join(), wait(), 或等待其余线程call notify(), notifyall())框架
notify是将某个waiting的线程状态改变为blocked(因为notify的线程还没有退出临界区,还没有释放锁,因此被唤醒的线程状态变为blocked),notifyAll是将全部线程的状态改变为blocked。spa
JAVA为提供了wait()和notifyAll以及notify()实现挂起线程,而且唤醒另一个等待的线程。(这些方法只能在一个同步语句或者同步方法内调用,缘由是由于若是一个方法不要求互斥,那么就没有必要在线程间监听或者是合做,每一个线程均可以自由访问这个方法。)操作系统
在JAVA虚拟机中,每一个对象(Object和class)经过某种逻辑关联监视器,为了实现监视器的互斥功能,每一个对象(Object和class)都关联着一个锁(有时也叫“互斥量”),这个锁在操做系统书籍中称为“信号量”,互斥(“mutex “)是一个二进制的信号量。线程
咱们知道JAVA每一个对象(Object/class) 都关联一个监视器,更好的说法应该是每一个对象(Object/class)都有一个监视器,对象能够有它本身的临界区,而且可以监视线程序列为了使线程协做,JAVA为提供了wait()和notifyAll以及notify()实现挂起线程,而且唤醒另一个等待的线程。对象
在java虚拟机中,每一个对象和类在逻辑上都和一个监听器相关联。为了实现监听器的共同执行能力,锁(有时候又叫互斥量)关联着每一个对象和类,在操做系统书上被称之为“信号量”,互斥量其实就是一个二态的信号量。继承
3: 原子类和synchronized 哪一个快?接口
就算没有竞争,synchronized也比原子操做慢。
Synchronized锁是独占的,意味着若是有别的线程在执行,当前线程只能是等待!
比较并交换(compare and swap, CAS),是原子操做的一种,可用于在多线程编程中实现不被打断的数据交换操做,从而避免多线程同时改写某一数据时因为执行顺序不肯定性以及中断的不可预知性产生的数据不一致问题。 该操做经过将内存中的值与指定数据进行比较,当数值同样时将内存中的数据替换为新的值。
它将内存位置的内容与给定值进行比较,只有在相同的状况下,将该内存位置的内容修改成新的给定值。 这是做为单个原子操做完成的。 原子性保证新值基于最新信息计算; 若是该值在同一时间被另外一个线程更新,则写入将失败。 操做结果必须说明是否进行替换; 这能够经过一个简单的布尔响应(这个变体一般称为比较和设置),或经过返回从内存位置读取的值来完成(摘自维基本科)
CAS包含3个参数:
V表示要更新的变量
E表示预期值
N表示新值
若是V值等于E值,则将V的值设为N。若V值和E值不一样,则说明已经有其余线程作了更新,则当前线程什么都不作。通俗的理解就是CAS操做须要咱们提供一个指望值,当指望值与当前线程的变量值相同时,说明还没线程修改该值,当前线程能够进行修改,也就是执行CAS操做,但若是指望值与当前线程不符,则说明该值已被其余线程修改,此时不执行更新操做,但能够选择从新读取该变量再尝试再次修改该变量,也能够放弃操做,原
4 java lock底层实现
5 多线程包
7 lock synchronized
8 同步方法 VS 同步代码块:
java中,每个对象都有一把锁,线程用synchronized获取对象上的锁。
非静态同步方法:锁是类的对象的锁。
静态同步方法:锁的是类自己。
同步方法块:锁是能够选择的。因此能更加精确的控制。粒度更细致,能够更精确的控制对象锁。
9 确保N个线程能够访问N个资源而不死锁?
指定资源获取顺序。全部线程都按照一样的顺序请求资源。
10 建立线程的方法:
继承Thread
实现Runnable接口:这种方式更受欢迎,由于能够继承其余的类。
Executor框架建立线程池
11 线程的几种可用状态:
new:刚建立的线程,可是没有调用start。
就绪(Runnable):调用start, run()方法就执行,可是不必定立刻执行。等待时间片。
运行(Running) :获得CPU能够执行,正在执行。
阻塞(waitting):正在运行到线程,暂时让出CPU。各类缘由能够致使阻塞:
sleep():调用一个在I/O上被阻塞的操做,即该操做在输入/输出完成前不会返回到调用者。
等待锁。
死亡:run() 方法正常退出,天然死亡。未捕获到异常终止了run方法而使线程猝死。