zoukankan      html  css  js  c++  java
  • java多线程快速入门(十三)

    死锁产生的原因(必须有两个线程、必须有多个锁、锁之间必须有引用的过程)

    package com.cppdy;
    
    class MyThread9 implements Runnable {
    
        private Integer ticketCount = 100;
        private Object ob = new Object();
        public boolean falg = true;
    
        @Override
        public void run() {
            if (falg) {
                synchronized (ob) {
                    while (ticketCount > 0) {
                        try {
                            Thread.sleep(50);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                        synchronized (this) {
                            System.out
                                    .println(Thread.currentThread().getName() + "卖出了第:" + (100 - ticketCount + 1) + "张票。");
                            ticketCount--;
                        }
                    }
                }
            } else {
                while (ticketCount > 0) {
                    sale();
                }
            }
        }
    
        public synchronized void sale() {
            synchronized (ob) {
                if (ticketCount > 0) {
                    try {
                        Thread.sleep(50);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + "卖出了第:" + (100 - ticketCount + 1) + "张票。");
                    ticketCount--;
                }
            }
        }
    }
    
    public class ThreadDemo9 {
    
        public static void main(String[] args) throws Exception {
            MyThread9 mt = new MyThread9();
            Thread thread1 = new Thread(mt, "窗口1");
            Thread thread2 = new Thread(mt, "窗口2");
            thread1.start();
            Thread.sleep(30);
            mt.falg = false;
            thread2.start();
        }
    
    }

    T1一直等待T2释放this锁

    T2又一直等待T1释放ob锁

  • 相关阅读:
    多态
    接口和抽象类
    反射
    C++ 模板和 C# 泛型的区别
    基础类库中的泛型
    运行时中的泛型
    泛型代码中的 default 关键字
    泛型委托
    泛型方法
    泛型接口
  • 原文地址:https://www.cnblogs.com/jiefu/p/10015769.html
Copyright © 2011-2022 走看看