27) 如何避免死锁?-达内培训负责整理
Java多线程中的死锁
死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.这是一个严重的问题,因为死锁会让你的程序挂起无法完成任务,死锁的发生必须满足以下四个条件:
互斥条件:一个资源每次只能被一个进程使用.
请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放.
不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺.
循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系.
避免死锁最简单的方法就是阻止循环等待条件,将系统中所有的资源设置标志位、排序,规定所有的进程申请资源必须以一定的顺序(升序或降序)做操作来避免死锁.
28) Java中活锁和死锁有什么区别?
这是上题的扩展,活锁和死锁类似,不同之处在于处于活锁的线程或进程的状态是不断改变的,活锁可以认为是一种特殊的饥饿.一个现实的活锁例子是两个人在狭小的走廊碰到,两个人都试着避让对方好让彼此通过,但是因为避让的方向都一样导致最后谁都不能通过走廊.简单的说就是,活锁和死锁的主要区别是前者进程的状态可以改变但是却不能继续执行.
29) 怎么检测一个线程是否拥有锁?
我一直不知道我们竟然可以检测一个线程是否拥有锁,直到我参加了一次电话面试.在java.lang.Thread中有一个方法叫holdsLock(),它返回true如果当且仅当当前线程拥有某个具体对象的锁.
30) 你如何在Java中获取线程堆栈?
对于不同的操作系统,有多种方法来获得Java进程的线程堆栈.当你获取线程堆栈时,JVM会把所有线程的状态存到日志文件或者输出到控制台.在Windows你可以使用Ctrl + Break组合键来获取线程堆栈,Linux下用kill -3命令.你也可以用jstack这个工具来获取,它对线程id进行操作,你可以用jps这个工具找到id.
31) JVM中哪个参数是用来控制线程的栈堆栈小的
这个问题很简单, -Xss参数用来控制线程的堆栈大小.你可以查看JVM配置列表来了解这个参数的更多信息.
32) Java中synchronized 和 ReentrantLock 有什么不同?
Java在过去很长一段时间只能通过synchronized关键字来实现互斥,它有一些缺点.比如你不能扩展锁之外的方法或者块边界,尝试获取锁时不能中途取消等.Java 5 通过Lock接口提供了更复杂的控制来解决这些问题. ReentrantLock 类实现了 Lock,它拥有与 synchronized 相同的并发性和内存语义且它还具有可扩展性.
以上就是达内培训给大家做的内容详解,更多关于IT知识的学习,请继续关注达内培训