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
  • 相关阅读:
    Python学习笔记9:变量作用域和列表
    Python文摘:argmin/argmax 与 idxmin/idxmax
    SQL学习笔记8
    SQL学习笔记7
    SQL学习笔记6
    SQL学习笔记5
    SQL文摘:sql(join中on与where区别)
    SQL学习笔记4
    SQL学习笔记3
    机器学习基石第三讲 Types of Learning
  • 原文地址:https://www.cnblogs.com/xiangpeng/p/7827171.html
Copyright © 2011-2022 走看看