Java 死锁 DeadLock

我不是女神ヾ 2024-03-27 16:33 206阅读 0赞

死锁

  • 多个线程各自占有一些共享资源,并且互相等待其他线程占有的资源,才能运行,从而导致两个或多个线程都在等待对方释放资源,都停止执行的情形。
  • 某一个同步块,同时拥有“两个以上对象的锁”时,就可能会发生死锁问题

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

  1. 互斥条件:一个资源每次只能被一个进程使用
  2. 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放
  3. 不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺
  4. 循环等待条件:若干进程之间形成一种头尾相接 的循环等待资源关系

    package com.syn;

    public class DeadLock {

    1. public static void main (String[] args) {
    2. MakeUp g1 = new MakeUp (0,"灰姑凉");
    3. MakeUp g2 = new MakeUp (1,"白雪公主");
    4. g1.start ();
    5. g2.start ();
    6. }

    }

    class Lipstick{

  1. }
  2. class Mirror{
  3. }
  4. class MakeUp extends Thread{
  5. //需要的资源只有一份,用static确保只有一份
  6. static Mirror mirror = new Mirror();
  7. static Lipstick lipstick = new Lipstick ();
  8. int choice;//选择
  9. String girlName;//使用化妆品的人
  10. public MakeUp (int choice, String girlName) {
  11. this.choice = choice;
  12. this.girlName = girlName;
  13. }
  14. @Override
  15. public void run () {
  16. makeUP ();
  17. }
  18. private void makeUP(){
  19. if (choice==0){
  20. synchronized (lipstick){
  21. System.out.println (this.girlName+"获得了口红的锁");
  22. try {
  23. Thread.sleep (1000);
  24. } catch (InterruptedException e) {
  25. e.printStackTrace ();
  26. }
  27. synchronized (mirror){
  28. System.out.println (this.girlName+"获得了镜子的锁");
  29. }
  30. }
  31. }else {
  32. synchronized (mirror){
  33. System.out.println (this.girlName+"获得了镜子的锁");
  34. try {
  35. Thread.sleep (2000);
  36. } catch (InterruptedException e) {
  37. e.printStackTrace ();
  38. }
  39. synchronized (lipstick){
  40. System.out.println (this.girlName+"获得了口红的锁");
  41. }
  42. }
  43. }
  44. }
  45. }

避免死锁的方法

  • 只要想办法破除死锁四个必要条件中的一个或多个条件就可以避免死锁发生

    package com.syn;

    public class DeadLock {

    1. public static void main (String[] args) {
    2. MakeUp g1 = new MakeUp (0,"灰姑凉");
    3. MakeUp g2 = new MakeUp (1,"白雪公主");
    4. g1.start ();
    5. g2.start ();
    6. }

    }

    class Lipstick{

  1. }
  2. class Mirror{
  3. }
  4. class MakeUp extends Thread{
  5. //需要的资源只有一份,用static确保只有一份
  6. static Mirror mirror = new Mirror();
  7. static Lipstick lipstick = new Lipstick ();
  8. int choice;//选择
  9. String girlName;//使用化妆品的人
  10. public MakeUp (int choice, String girlName) {
  11. this.choice = choice;
  12. this.girlName = girlName;
  13. }
  14. @Override
  15. public void run () {
  16. makeUP ();
  17. }
  18. private void makeUP(){
  19. if (choice==0){
  20. synchronized (lipstick){
  21. System.out.println (this.girlName+"获得了口红的锁");
  22. try {
  23. Thread.sleep (1000);
  24. } catch (InterruptedException e) {
  25. e.printStackTrace ();
  26. }
  27. }
  28. synchronized (mirror){
  29. System.out.println (this.girlName+"获得了镜子的锁");
  30. }
  31. }else {
  32. synchronized (mirror){
  33. System.out.println (this.girlName+"获得了镜子的锁");
  34. try {
  35. Thread.sleep (2000);
  36. } catch (InterruptedException e) {
  37. e.printStackTrace ();
  38. }
  39. }
  40. synchronized (lipstick){
  41. System.out.println (this.girlName+"获得了口红的锁");
  42. }
  43. }
  44. }
  45. }

发表评论

表情:
评论列表 (有 0 条评论,206人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java DeadLock

    死锁 多个线程各自占有一些共享资源,并且互相等待其他线程占有的资源,才能运行,从而导致两个或多个线程都在等待对方释放资源,都停止执行的情形。 某一个同步块,同

    相关 JAVA

    面试中经常会被问到死锁,今天就来整理一下死锁的相关知识。 首先看一下死锁的产生,死锁产生的情况有很多种,例如进程推进顺序不当产生死锁、PV操作使用不当产生死锁、资源分配不当引