zoukankan      html  css  js  c++  java
  • 多线程-死锁代码示例

    原文出自:https://blog.csdn.net/seesun2012

    什么是死锁:
    死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

    示例代码:

    package com.seesun2012.csdn.cn;
    /**
     * 死锁
     * 
     * @author seesun2012@163.com
     *
     */
    public class DeadLockDemo {
    	private static String A = "A";
    	private static String B = "B";
    	
    	
    	public static void main(String[] args) {
    		new DeadLockDemo().deadlock();
    	}
    	
    	private void deadlock() {
    		//  定义t1线程,锁定A变量睡眠2秒去抢占B的资源
    		Thread t1 = new Thread(new Runnable() {
    			@Override
    			public void run() {
    				System.out.println("进入线程t1");
    				synchronized (A) {
    					try {
    						Thread.currentThread();
    						Thread.sleep(2000);
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					}
    					synchronized (B) {
    						System.err.println("1");
    					}
    				}
    			}
    		});
    		
    		//  定义t2线程,锁定B变量去抢占A的资源
    		Thread t2 = new Thread(new Runnable() {
    			@Override
    			public void run() {
    				System.out.println("进入线程t2");
    				synchronized (B) {
    					synchronized (A) {
    						System.out.println("2");
    					}
    				}
    			}
    		});
    		
    		//  启动线程
    		t1.start();
    		t2.start();
    		
    	}
    	
    }
    

    如何避免死锁?
    避免一个线程同时获取多个锁。
    避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源。
    尝试使用定时锁,使用lock.tryLock(timeout)来代替使用内部所机制。
    对于数据库锁,加锁和解锁鼻息在一个数据库连接里进行,否则会出现解锁失败的情况。

  • 相关阅读:
    python字符串,列表,字典的常用方法
    Python【第一课】 Python简介和基础
    python中index()与find()的差异
    tomcat学习笔记2
    tomcat学习笔记1
    haproxy学习笔记
    高可用工具keepalived学习笔记
    ngx_http_upstream_module模块学习笔记
    nginx的rewrite,gzip,反向代理学习笔记
    nginx学习笔记1
  • 原文地址:https://www.cnblogs.com/seesun2012/p/9214706.html
Copyright © 2011-2022 走看看