zoukankan      html  css  js  c++  java
  • Java死锁举例

    死锁:

        在多线程竞争使用共享资源的情况下。就有可能出现死锁的情况。比方,当一个线程等待还有一个线程所持有的锁时。那个线程又可能在等待第一个线程所持有的锁。此时。这两个线程会陷入无休止的相互等待状态。这样的情况就称为死锁。

    产生死锁的四个必要条件:

    1、相互排斥条件。

    进程对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占有。

    2、请求和保持条件。当进程因请求资源而堵塞时,对已获得的资源保持不放。

    3、不剥夺条件。

    进程已获得的资源,在未使用完之前。不能被剥夺。仅仅能在使用完时由自己释放。

    4、环路等待条件。

    在发生死锁时,必定存在一个进程-资源的环形链。即进程集合{P1,P2,。。。

    ,Pn}中的P1等待一个P2占用的资源,P2正在等待一个P3占用的资源。。

    。,Pn正在等待已被P1所占用的资源。


    比較简单的解决死锁的方法是通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或者几个。来预防发生死锁。预防死锁是一种较易实现的方法,已被广泛使用。可是因为所施加的限制条件往往太严格。可能会导致系统资源利用率和系统吞吐量减少。

    以下是产生死锁的一个演示样例:

    package com.hh.deadLock;
    
    public class DeadLockDemo {
    
    	public static void main(String[] args) {
    		final Object resource1 = "资源1";
    		final Object resource2 = "资源2";
    		Thread t1 = new Thread(){
    			public void run() {
    				synchronized(resource1){
    					System.out.println("线程1:获取资源1使用权");
    					try {
    						Thread.sleep(500);
    					} catch (Exception e) {	}
    					synchronized(resource2){
    						System.out.println("线程1:等待资源2");
    					}
    				}
    			}
    		};
    		Thread t2 = new Thread(){
    			public void run() {
    				synchronized(resource2){
    					System.out.println("线程2:获取资源2使用权");
    					try {
    						Thread.sleep(500);
    					} catch (Exception e) {	}
    					synchronized(resource1){
    						System.out.println("线程2:等待资源1");
    					}
    				}
    			}
    		};
    		
    		t1.start();
    		t2.start();
    	}
    }
    

    程序会先打印出

    线程1:获取资源1使用权
    线程2:获取资源2使用权
    或者是

    线程2:获取资源2使用权
    线程1:获取资源1使用权
    然后程序就不再往下运行

    线程t1获取“资源1”使用权后等待“资源2”。而线程t2获取“资源2”使用权后等待“资源1”。这样,线程t1和线程t2就引起了死锁。

    假设将程序中的Thread.sleep(500);这行代码凝视,则程序可能引起死锁,也可能不引起。

  • 相关阅读:
    类图class的依赖关系
    ASP.NET MVC 5
    单例模式
    facebook .net sdk 应用
    跟我一起云计算(1)——storm
    C# 求精简用一行代码完成的多项判断 重复赋值
    语音播报实时天气
    滚动监听
    10277
    第十届蓝桥杯JavaB组省赛真题
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/7281307.html
Copyright © 2011-2022 走看看