线程中wait和sleep的区别
wait():wait()方法是Object类里的方法,用于线程通讯,挂起,放cpu,放锁
1进入等待池
2释放对象锁,超时后返回
3其它线程能够访问
wait至关于多车道中靠边停车,释放锁和cpu
sleep():是Thread类的方法,用于线程的运行状态控制,睡眠,必须捕获异常,放cpu,不放锁
1阻塞当前线程,出让cpu
2锁没有释放,其它线程没法访问这个对象
3休眠时间满了之后不必定执行,由于其它线程可能正在运行,出发sleep的线程有更高优先级
sleep至关于多车道中,车停在车道上(睡着了),该车道没法使用,而后多出一条车道能够给别的车使用
【注意】notify并不释放锁,只是告诉调用过wait方法的线程能够去参与得到锁的竞争了,但不是立刻获得锁,由于锁还在别人手里,别人还没释放。若是notify方法后面的代码还有不少,须要这些代码执行完后才会释放锁
【总结】notify是告诉wait()的线程何时能够去继续去申请锁了
sleep(100L)是占用cpu,线程休眠100毫秒,其余进程不能再占用cpu资源,wait(100L)是进入等待池中等待,交出cpu 等系统资源供其余进程使用,在这100毫秒中,该线程能够被其余线程notify,但不一样的是其余在等待池中的线程不被notify不会出来,但这个线程 在等待100毫秒后会自动进入就绪队列等待系统分配资源,换句话说,sleep(100)在100毫秒后确定会运行,但wait在100毫秒后还有等待 os调用分配资源,因此wait100的中止运行时间是不肯定的,但至少是100毫秒。面试
多线程:
1同步包括互斥,互斥实际上是一种特殊的同步
2ThreadLocal 线程局部变量的做用和目的:用于实现线程内的数据共享,即对于相同的程序代码,多个模块在同一个线程中运行时要共享一份数据,而在另外线程中运行时又共享另一份数
3多线程共享数据
多个线程行为一致,共同操做一个数据源。也就是每一个线程执行的代码相同,可使用同一个 Runnable 对
象,这个 Runnable 对象中有那个共享数据
多个线程行为不一致,共同操做一个数据源。也就是每一个线程执行的代码不一样,这时候须要用不一样的
Runnable 对象。
4线程并发库 太多了缓存
实现线程安全的两种方式?
synchronized与Lock。
两者的区别是什么?
synchronized不能中断等待;
Lock能够中断等待。
synchronized在JVM层面实现,出现异常时能够自动释放锁定;
Lock在代码层面实现,必须在finally{}中unLock。
资源竞争不激烈时,synchronized性能优;
资源竞争激烈时,Lock性能优。安全
Thread 类中的start() 和 run() 方法有什么区别?
当你调用run()方法的时候,只会是在原来的线程中调用,没有新的线程启动,start()方法才会启动新线程
run()是start()的回调函数多线程
Java中Runnable和Callable有什么不一样?
主要区别是Callable的 call() 方法能够返回值和抛出异常,而Runnable的run()方法没有这些功能。Callable能够返回装载有计算结果的Future对象
用Runnable仍是Thread?
Java不支持类的多重继承,但容许你调用多个接口。因此若是你要继承其余类,固然是调用Runnable接口好了并发
Java中的volatile 变量是什么?
volatile是一个特殊的修饰符,只有成员变量才能使用它。在Java并发程序缺乏同步类的状况下,多线程对成员变量的操做对其它线程是透明的。volatile变量能够保证下一个读取操做会在前一个写操做以后发生,就是上一题的volatile变量规则函数
为何wait, notify 和 notifyAll这些方法不在thread类里面?
因为wait,notify和notifyAll都是锁级别的操做,因此把他们定义在Object类中由于锁属于对象
Java中堆和栈有什么不一样?
为何把这个问题归类在多线程和并发面试题里?由于栈是一块和线程紧密相关的内存区域。每一个线程都有本身的栈内存,用于存储本地变量,方法参数和栈调用,一个线程中存储的变量对其它线程是不可见的。而堆是全部线程共享的一片公用内存区域。对象都在堆里建立,为了提高效率线程会从堆中弄一个缓存到本身的栈,若是多个线程使用该变量就可能引起问题,这时volatile 变量就能够发挥做用了,它要求线程从主存中读取变量的值。
如何避免死锁?
死锁是指两个或两个以上的进程在执行过程当中,因争夺资源而形成的一种互相等待的现象,若无外力做用,它们都将没法推动下去。这是一个严重的问题,由于死锁会让你的程序挂起没法完成任务,死锁的发生必须知足如下四个条件:
互斥条件:一个资源每次只能被一个进程使用。
请求与保持条件:一个进程因请求资源而阻塞时,对已得到的资源保持不放。
不剥夺条件:进程已得到的资源,在末使用完以前,不能强行剥夺。
循环等待条件:若干进程之间造成一种头尾相接的循环等待资源关系。
避免死锁最简单的方法就是阻止循环等待条件,将系统中全部的资源设置标志位、排序,规定全部的进程申请资源必须以必定的顺序(升序或降序)作操做来避免死锁。
Java线程池中submit() 和 execute()方法有什么区别?
两个方法均可以向线程池提交任务,execute()方法的返回类型是void,它定义在Executor接口中, 而submit()方法能够返回持有计算结果的Future对象,它定义在ExecutorService接口中,它扩展了Executor接口
Java多线程中调用wait() 和 sleep()方法有什么不一样?
Java程序中wait 和 sleep都会形成某种形式的暂停,它们能够知足不一样的须要。wait()方法用于线程间通讯,若是等待条件为真且其它线程被唤醒时它会释放锁,而sleep()方法仅仅释放CPU资源或者让当前线程中止执行一段时间,但不会释放锁。性能