zoukankan      html  css  js  c++  java
  • JAVA死锁

      死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不能正常运行。

      简单的说就是:线程死锁时,第一个线程等待第二个线程释放资源,而同时第二个线程又在等待第一个线程释放资源。假设这种情况一直持续下去,这样就会发生死锁现象。 

         导致死锁的根源在于不适当地运用“synchronized”关键词来管理线程对特定对象的访问。“synchronized”关键词的作用是,确保在某个时刻只有一个线程被允许执行特定的代码块,因此,被允许执行的线程首先必须拥有对变量或对象的排他性访问权。当线程访问对象时,线程会给对象加锁,而这个锁导致其它也想访问同一对象的线程被阻塞,直至第一个线程释放它加在对象上的锁。

    demo:

    public class SyncDeadLock {
    	private static Object locka = new Object();
    	private static Object lockb = new Object();
    
    	public static void main(String[] args) {
    		new SyncDeadLock().deadLock();
    	}
    
    	private void deadLock() {
    		Thread thread1 = new Thread(new Runnable() {
    			public void run() {
    				synchronized (locka) {
    					try {
    						System.out.println(Thread.currentThread().getName()+ " get locka ing!");
    						Thread.sleep(500);
    						System.out.println(Thread.currentThread().getName()+ " after sleep 500ms!");
    					} catch (Exception e) {
    						e.printStackTrace();
    					}
    					System.out.println(Thread.currentThread().getName()+ " need lockb!Just waiting!");
    					synchronized (lockb) {
    						System.out.println(Thread.currentThread().getName()+ " get lockb ing!");
    					}
    				}
    			}
    		}, "thread1");
    
    		Thread thread2 = new Thread(new Runnable() {
    			public void run() {
    				synchronized (lockb) {
    					try {
    						System.out.println(Thread.currentThread().getName()+ " get lockb ing!");
    						Thread.sleep(500);
    						System.out.println(Thread.currentThread().getName()+ " after sleep 500ms!");
    					} catch (Exception e) {
    						e.printStackTrace();
    					}
    					System.out.println(Thread.currentThread().getName()+ " need locka! Just waiting!");
    					synchronized (locka) {
    						System.out.println(Thread.currentThread().getName()+ " get locking!");
    					}
    				}
    			}
    		}, "thread2");
    
    		thread1.start();
    		thread2.start();
    	}
    }
    

     控制台打印输出为:

     

    这样就形成了死锁。

     

    yian
  • 相关阅读:
    为什么今日头条是技术牛人收割机(FW)
    独家|浅谈用户行为数据的价值挖掘(PPT)(FW)
    深度学习笔记
    "堕落"的头条,还是"不堪"的民众?
    理解传统企业的问题与困惑
    人工智能在医疗领域究竟要怎么玩?(FW)
    佟崴嵬
    youtube true view的逻辑
    AI第一性原理
    域对象的属性和请求的转发重定向
  • 原文地址:https://www.cnblogs.com/xiangpeng/p/7827171.html
Copyright © 2011-2022 走看看