iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >java多线程学习之死锁的模拟和避免(实例讲解)
  • 587
分享到

java多线程学习之死锁的模拟和避免(实例讲解)

java多线程避免 2023-05-31 11:05:31 587人浏览 泡泡鱼
摘要

1.死锁死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。Java 死锁产生的四个必要条件:互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用不可抢

1.死锁

是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。

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

互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用

不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。

请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的占有。

循环等待,即存在一个等待队列:P1占有P2的资源,P2占有P3的资源,P3占有P1的资源。这样就形成了一个等待环路。

当上述四个条件都成立的时候,便形成死锁。当然,死锁的情况下如果打破上述任何一个条件,便可让死锁消失。

2.模拟一个死锁

package com.tl.skyLine.thread;  import java.util.Date;   public class DeadLock {  public static String bowl = "碗";  public static String chopsticks = "筷子";   public static void main(String[] args) {   LockA la = new LockA();   new Thread(la).start();   LockB lb = new LockB();   new Thread(lb).start();  }  }   class LockA implements Runnable {  public void run() {   try {    System.out.println(new Date().toString() + "邹保健开始拿餐具吃饭");    while (true) {     synchronized (DeadLock.bowl) {      System.out.println(new Date().toString() + "邹保健抢到了碗");      Thread.sleep(3000); // 此处等待是给B能锁住机会      synchronized (DeadLock.chopsticks) {       System.out.println(new Date().toString() + "邹保健抢到了筷子");       Thread.sleep(60 * 1000); // 为测试,占用了就不放      }     }    }   } catch (Exception e) {    e.printStackTrace();   }  } }  class LockB implements Runnable {  public void run() {   try {    System.out.println(new Date().toString() + "陈顶天开始拿餐具吃饭");    while (true) {     synchronized (DeadLock.chopsticks) {      System.out.println(new Date().toString() + "陈顶天抢到了筷子");      Thread.sleep(3000); // 此处等待是给A能锁住机会      synchronized (DeadLock.bowl) {       System.out.println(new Date().toString() + "陈顶天抢到了碗");       Thread.sleep(60 * 1000); // 为测试,占用了就不放      }     }    }   } catch (Exception e) {    e.printStackTrace();   }  } } 

--结束END--

本文标题: java多线程学习之死锁的模拟和避免(实例讲解)

本文链接: https://www.lsjlt.com/news/225261.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • java多线程学习之死锁的模拟和避免(实例讲解)
    1.死锁死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。Java 死锁产生的四个必要条件:互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用不可抢...
    99+
    2023-05-31
    java 多线程 避免
  • Java多线程死锁如何避免及解决
    本篇内容介绍了“Java多线程死锁如何避免及解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!下面是一个多线程死锁的例子输出thread1&...
    99+
    2023-06-02
  • Java多线程之锁的强化学习
    目录Java8锁SynchronizedReentrantLockAQSvolatile自旋锁 ,自旋锁的其他种类CAS 自旋锁CAS的实现原理首先强调一点:Java多线程的锁都是基...
    99+
    2023-02-26
    Java多线程 锁 Java多线程 Java 锁
  • Java多线程之死锁的示例分析
    小编给大家分享一下Java多线程之死锁的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!什么是死锁死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全...
    99+
    2023-05-30
    java
  • Java多线程求和实例讲解
    本篇内容主要讲解“Java多线程求和实例讲解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java多线程求和实例讲解”吧!编写一个启动100个线程的程序,每个线程给一个初值为0的变量sum加1,...
    99+
    2023-06-17
  • java多线程之火车售票系统模拟实例
    1.前言为了学习多线程共享与通信,我们模拟一个火车售票系统,假设有10张火车票,三个窗口(也就是三个线程)同时进行售票。2.非同步代码package com.tl.skyLine.thread; public class SellTic...
    99+
    2023-05-31
    java 多线程 模拟售票
  • java 线程之对象的同步和异步(实例讲解)
    一、多线程环境下的同步与异步同步:A线程要请求某个资源,但是此资源正在被B线程使用中,因为同步机制存在,A线程请求不到,怎么办,A线程只能等待下去。package com.jalja.org.thread.demo01;public cla...
    99+
    2023-05-31
    java 线程 同步
  • Java多线程之多种锁和阻塞队列的示例分析
    这篇文章给大家分享的是有关Java多线程之多种锁和阻塞队列的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、悲观锁和乐观锁1.1. 乐观锁顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以...
    99+
    2023-06-15
  • Java之线程编程的4种方法实现案例讲解
    1、继承Thread public class T4 { public static void main(String[] args) { System.out.print...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作