zoukankan      html  css  js  c++  java
  • JavaSE 基础 第60节 死锁问题

    2016-07-02

    1 死锁问题
    线程A现在占用资源2,需要请求资源1
    线程B现在占用资源1,需要请求资源2

    线程2获得了资源2
    线程1获得了资源1
    线程3获得了资源3
    线程3在等待资源1
    线程1在等待资源2
    线程2在等待资源3

    package com.java1995;
    /**
     * 资源类
     * @author Administrator
     *
     */
    public class Resource {
        
        String resourceName;
        public Resource(String resourceName){
            this.resourceName=resourceName;
        }
    
    }
    package com.java1995;
    /**
     * 线程类
     * @author Administrator
     *
     */
    public class MyThread extends Thread{
        
        Resource r1;
        Resource r2;
        MyThread(Resource r1,Resource r2,String name){
            super(name);
            this.r1=r1;
            this.r2=r2;
        }
        
        public void run(){
            synchronized (r1) {
                System.out.println(this.getName()+"获得了"+r1.resourceName);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                System.out.println(this.getName()+"在等待"+r2.resourceName);
                synchronized (r2) {
                    System.out.println(this.getName()+"获得了"+r2.resourceName);
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                
            }
        }
    
    }
    package com.java1995;
    /**
     * 测试类
     * @author Administrator
     *
     */
    public class Test {
        
        public static void main(String[] args) {
            Resource rs1=new Resource("资源1");
            Resource rs2=new Resource("资源2");
            Resource rs3=new Resource("资源3");
            
            MyThread t1=new MyThread(rs1,rs2,"线程1");
            MyThread t2=new MyThread(rs2,rs3,"线程2");
            MyThread t3=new MyThread(rs3,rs1,"线程3");
            
            t1.start();
            t2.start();
            t3.start();
    
        }
    
    }

    【参考资料】

    [1] Java轻松入门经典教程【完整版】

  • 相关阅读:
    AE开发 入门教程
    工作空间工厂 打开文件例子
    Delphi IDE使用的一些主要技巧
    动画演示 Delphi 2007 IDE 功能[2]
    Delphi的类与继承
    属性的自动完成
    DELPHI中函数、过程变量的声明与应用
    Delphi回车键切换焦点
    delphi 窗体的创建和释放
    delphi assigned函数的用法
  • 原文地址:https://www.cnblogs.com/cenliang/p/5635466.html
Copyright © 2011-2022 走看看