zoukankan      html  css  js  c++  java
  • 死锁

    package LESSON12;
    public class Thread1 extends Thread{
        @Override
        public void run() {    
           synchronized(MyThread.lockA){
           System.out.println(getName()+"获取对象锁A");
    synchronized (MyThread.lockB) {
              System.out.println(getName()+"获取对象锁B");
    }
           System.out.println(getName()+"释放对象锁B");
    }
         System.out.println(getName()+"释放对象锁A");
    } }
    package LESSON12;
    public class Thread2 extends Thread{
    
        @Override
        public void run() {
    //        try {
    //            sleep(5000);//等待线程1执行完后释放锁再执行
    //        } catch (InterruptedException e) {
    //            // TODO Auto-generated catch block
    //            e.printStackTrace();
    //        }
    synchronized(MyThread.lockB){        System.out.println(getName()+"获取对象锁B"); synchronized (MyThread.lockA) {           System.out.println(getName()+"获取对象锁A"); }
           System.out.println(getName()+"释放对象锁A");
    }
          System.out.println(getName()+"释放对象锁B"); } }
    package LESSON12;
    class MyThread {
        final static Object lockA = new Object();
        final static Object lockB = new Object();
    
    }
    public class TestThread {
        /**
         * @param args
         */
        public static void main(String[] args) {
            Thread1 thread1 = new Thread1();
            thread1.setName("thread1");
            Thread2 thread2 = new Thread2();
            thread2.setName("thread2");    
            
            thread1.start();
            thread2.start();
        
        }
    
    }

    运行结果

    虚拟灯不灭

    使用单例模式:一个类只能产生唯一一个实例对象

    1不允许new-------私有化构造方法

    2自己new一个对象

    3提供一个公开静态的get方法

    package com.zy.demo07;
    public class A {
        private A() {
            // TODO Auto-generated constructor stub
        }    
        private static A a=new A();//静态方法不能有非静态变量
        public static A getA(){
            return a;
        }    
    }
    package com.zy.demo07;
    public class B {
        private B() {
        }
        private static B b=new B();
        public static B getB(){
            return b;
        }
    }
    package com.zy.demo07;
    public class MyRunnable1 implements Runnable{
        @Override
        public void run() {
            synchronized (A.getA()) {
                System.out.println("线程1进入红色同步代码块");
                synchronized (B.getB()) {
                    System.out.println("线程1进入蓝色同步代码块");    
                }
                System.out.println("线程1出了蓝色同步代码块");    
            }
            System.out.println("线程1出了红色同步代码块");    
        }
    }
    package com.zy.demo07;
    public class MyRunnable2 implements Runnable{
        public void run() {
            synchronized (B.getB()) {
                System.out.println("线程2进入蓝色同步代码块");
                synchronized (A.getA()) {
                    System.out.println("线程2进入红色同步代码块");                        
                }
                System.out.println("线程2出了红色色同步代码块");
            }
            System.out.println("线程2出了蓝色同步代码块");        
        }
    }
    package com.zy.demo07;
    public class Test {
        public static void main(String[] args) {
            Thread thread1 = new Thread(new MyRunnable1());
            Thread thread2 = new Thread(new MyRunnable2());
            thread1.start();
            thread2.start();
        }
    }

    结果

    注:死锁并不是每一次运行时都会出现,只是说这样写可能会出现死锁。

    如下图属于正常情况:线程一走完释放锁B和A后,线程二再运行就不会发生死锁现象

     死锁情况:线程一锁定A,等待线程二释放B。线程二锁定B,等待线程一释放A。

  • 相关阅读:
    Visual C#使用DirectX实现视频播放
    windows WMIC命令大全
    WMI 无法监视时必须要尝试的手段 winmgmt /resyncperf
    DirectX技术实现视频会议中的音频通信
    c++引用
    c++模板详解
    四元数
    static_cast 和 dynamic_cast
    C++堆和栈详解(转)
    设计模式六大设计原则
  • 原文地址:https://www.cnblogs.com/qfdy123/p/11094293.html
Copyright © 2011-2022 走看看