zoukankan      html  css  js  c++  java
  • Java多线程死锁的产生实例

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

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

    示例:死锁实例

    package cn.thread.lock;
    
    public class ThreadLock implements Runnable{
        private static Object o1=new Object(), o2=new Object();
        private int flag1=0;
        
        @Override
        public void run() {
            System.out.println("flag1=" + flag1);
            if(flag1==0){
                synchronized (o1) {
                    System.out.println(Thread.currentThread().getName()+"我已经锁定o1");
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    
                    synchronized (o2) {
                        System.out.println(Thread.currentThread().getName()+"我已经锁定o2");
                    }
                }
                
            }
            if(flag1==1){
                synchronized (o2) {
                    System.out.println(Thread.currentThread().getName()+"我已经锁定o2");
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (o1) {
                        System.out.println(Thread.currentThread().getName()+"我已经锁定o1");
                    }
                }
                
            }
            
        }
        public static void main(String[] args) {
            ThreadLock r=new ThreadLock();
            
            ThreadLock r1=new ThreadLock();
            r1.flag1=0;
            r.flag1=1;
            Thread t=new Thread(r);
            Thread t1=new Thread(r1);
            t1.setName("t1");
            t.setName("t");
            t1.start();
            t.start();
            
        }
    
    }

    说明:1.一个资源每次只能被一个进程使用--》

    `  a.所以要使用 synchronized 关键字,保证一个资源被一个进程使用。

        b.o1,o2一定要是静态的,保证是同一个资源。

  • 相关阅读:
    基于C/S模式的程序更新下载
    拓展方法
    主从级GridView
    using 的用法
    五大数据类型
    redis的主从复制原理及步骤
    redis的发布订阅
    redis的持久化
    redis的事务
    配置文件详解
  • 原文地址:https://www.cnblogs.com/sloveling/p/synchronized_thread.html
Copyright © 2011-2022 走看看