1:blocked线程和waiting的线程的区别? 如何唤醒?
java线程中含有waiting与blocked两种状态:
线程的 blocked状态往往是无法进入同步方法/代码块来完成的。这是因为无法获取到与同步方法/代码块相关联的锁。
JAVA为提供了wait()和notifyAll以及notify()实现挂起线程,并且唤醒另外一个等待的线程。
在JAVA虚拟机中,每个对象(Object和class)通过某种逻辑关联监视器,为了实现监视器的互斥功能,每个对象(Object和class)都关联着一个锁(有时也叫“互斥量”),这个锁在操作系统书籍中称为“信号量”,互斥(“mutex “)是一个二进制的信号量。
我们知道JAVA每个对象(Object/class) 都关联一个监视器,更好的说法应该是每个对象(Object/class)都有一个监视器,对象可以有它自己的临界区,并且能够监视线程序列为了使线程协作,JAVA为提供了wait()和notifyAll以及notify()实现挂起线程,并且唤醒另外一个等待的线程。
在java虚拟机中,每个对象和类在逻辑上都和一个监听器相关联。为了实现监听器的共同执行能力,锁(有时候又叫互斥量)关联着每个对象和类,在操作系统书上被称之为“信号量”,互斥量其实就是一个二态的信号量。
2: 为甚cocurrentMap效率高?
3: 原子类和synchronized 那个快
4 java lock底层实现
5 多线程包
6 correntHashmap原理
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方法而使线程猝死。
原文:https://www.cnblogs.com/liufei1983/p/10925083.html