您的位置:首页 > 编程语言 > Java开发

Java 死锁(DeadLock)实例分析和预防[base jdk8]

2018-02-03 11:49 381 查看

synchronized实现死锁

/**
* Created by Administrator on 2018/2/3.
*/
public class SynchronizedDeadLockTest {

static Object src1 = new Object();
static Object src2 = new Object();

public static void main(String[] args) {
Thread t1 = new Thread(new DeadARunnable(), "t1");
Thread t2 = new Thread(new DeadBRunnable(), "t2");
t1.start();
t2.start();
}
}

class DeadARunnable implements Runnable {
@Override
public void run() {
synchronized (SynchronizedDeadLockTest.src1){
try{
System.out.println(Thread.currentThread().getName()+" get src1 ing!");
Thread.sleep(500);
System.out.println(Thread.currentThread().getName()+" after sleep 500ms!");
}catch(Exception e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" need src2 and waiting!");
/**
* Thread t2 try get source src2 when locked source src1
*/
synchronized (SynchronizedDeadLockTest.src2){
System.out.println(Thread.currentThread().getName()+" get src2 ing!");
}
}
}
}

class DeadBRunnable implements Runnable {
@Override
public void run() {
synchronized (SynchronizedDeadLockTest.src2){
try{
System.out.println(Thread.currentThread().getName()+" get src2 ing!");
Thread.sleep(500);
System.out.println(Thread.currentThread().getName()+" after sleep 500ms!");
}catch(Exception e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" need src1 and waiting!");
/**
* Thread t1 try get source src1 when locked source src2
*/
synchronized (SynchronizedDeadLockTest.src1){
System.out.println(Thread.currentThread().getName()+" get src1 ing!");
}
}
}
}

饥饿

指的线程无法访问到它需要的资源而不能继续执行的一种状态。引发饥饿最常见资源就是CPU时钟周期。虽然在Thread API中由指定线程优先级的机制,但是只能作为操作系统进行线程调度的一个参考,操作系统在进行线程调度是平台无关的,会尽可能提供公平的、活跃性良好的调度,那么即使在程序中指定了线程的优先级,也有可能在操作系统进行调度的时候映射到了同一个优先级。通常情况下,不要区修改线程的优先级,一旦修改程序的行为就会与平台相关,并且会导致饥饿问题的产生。在程序中使用的Thread.yield或者Thread.sleep表明该程序试图客服优先级调整问题,让优先级更低的线程拥有被CPU调度的机会。

活锁

指的是线程不断重复执行相同的操作,但每次操作的结果都是失败的。尽管这个问题不会阻塞线程,但是程序也无法继续执行。活锁通常发生在处理事务消息的应用程序中,如果不能成功处理这个事务那么事务将回滚整个操作。解决活锁的办法是在每次重复执行的时候引入随机机制,这样由于出现的可能性不同使得程序可以继续执行其他的任务。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: