zoukankan      html  css  js  c++  java
  • Java多线程-死锁

    package com.swust.four;
    /**
    * 多线程因为竞争资源而产生死锁
    * 在操作系统中,临界资源是同一时间只准一个进程使用的资源,
    * 临界区是进程访问临街资源期间所执行的那段程序。产生死锁
    * 所需要的四个必要条件是:
    * 1.临界资源使用的互斥性。
    * 2.部分地分配资源
    * 3.资源的循环等待
    * 4.资源的不可抢占性
    * 对于Java而言,死锁主要是线程死锁。临界资源就是同一时间只
    * 准一个线程使用的资源,临界区是线程访问临界资源所执行的那
    * 段程序。Java中的synchronized就是用来保持临界区同步的。
    * @author 死锁
    */
    public class DeadLock {

    public static void main(String[] args) {

    //定义线程竞争的两个临界资源
    final Object resourceOne = "resourceOne";
    final Object resourceTwo = "resourceTwo";
    //第一个线程,先竞争resourceOne,后竞争resourceTwo
    Thread t1 = new Thread(){
    public void run(){
    //锁定resourceOne
    synchronized(resourceOne){
    System.out.println("Thread 1: locked resourceOne");
    //线程休眠一段时间
    try {
    Thread.sleep(50);
    } catch (InterruptedException e) {
    // TODO: handle exception
    }
    //竞争resourceTwo
    synchronized (resourceTwo) {
    System.out.println("Thread 1: locked resourceTwo");
    }
    }
    }
    };
    //第二个线程,先竞争resourceTwo,后竞争resourceOne
    Thread t2 = new Thread(){
    public void run(){
    synchronized (resourceTwo) {
    System.out.println("Thread 2: lockede resouceTwo");
    //线程休眠
    try {
    Thread.sleep((int)Math.random()*100);
    } catch (InterruptedException e) {
    // TODO: handle exception
    }
    synchronized (resourceOne) {
    System.out.println("Thread 2: locked resourceOne");
    }
    }
    }
    };
    //启动线程
    t1.start();
    t2.start();
    }
    }

    //结果分析

     如此可见 Thread1和Thread2始终都得不到他们想要的资源,thread1想要resourceTwo的资源始终被thread2占用

    thread2想要resourceOne的资源始终被thread1占用。

  • 相关阅读:
    react中React.createRef()的使用
    react中this指向问题
    react中对props进行限制
    react中this问题
    react 中this问题
    类中方法的this
    类中方法的this
    react中render函数里面的this指向?
    Android一对一直播系统源码开发,仿朋友圈发布动态的实现
    Android游戏陪玩源码开发中,阴影效果的实现
  • 原文地址:https://www.cnblogs.com/walxt/p/12200102.html
Copyright © 2011-2022 走看看