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

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调度的机会。


活锁

指的是线程不断重复执行相同的操作,但每次操作的结果都是失败的。尽管这个问题不会阻塞线程,但是程序也无法继续执行。活锁通常发生在处理事务消息的应用程序中,如果不能成功处理这个事务那么事务将回滚整个操作。解决活锁的办法是在每次重复执行的时候引入随机机制,这样由于出现的可能性不同使得程序可以继续执行其他的任务。

你可能感兴趣的:(网络通信-多线程,JAVA)