黑马程序员_多线程(死锁)

------- android培训、java培训、期待与您交流! ----------

多线程_死锁

第一部分

1、死锁的描述

|--你持有一个锁,我也持有一个锁,我要到你的里面去运行,我就要拿到你的锁,而你要到我的里面的来运行,你也要向我要锁,我不放我的锁,我要进你的里面去,你不放你的锁,你要到我的里面来,谁都不放,相持不下,这样就导致了死锁的发生;这个现象就导致了程序就挂那边不动了,
|--举例:你有一个筷子,我也有一根筷子,我说把你的筷子给我,我要吃饭,但是这是你也说让我把我的筷子给你,你也要吃饭,但是你不放你的筷子,我也不放我的这根筷子,咱们相持不下,谁都不要吃饭;

2、死锁的出现

|--通常死锁的出现都是同步中嵌套同步
|--要让一个同步函数进入到同步代码快里面,让一个同步代码快进入到一个同步函数里面;

3、死锁代码体现

class Ticket implements Runnable
{
	private int tick =800;
	Object obj = new Object();
	boolean flag = true;
	public void run()
	{
		if(flag)
			while(true)
			{
//			同步代码块里面有同步函数,同步代码快用的锁是obj,同步函数用的锁是this
				synchronized(obj)
				{
					show();
				}
			}
			else
				while(true)
					show();
	}
//	同步函数里面有同步代码块,this锁里面有obj锁
	public synchronized void show()
	{
		synchronized(obj)
		{
			if(tick>0)
			{
				try
				{
					Thread.sleep(10);
				}
				catch (Exception e)
				{
					System.out.println(e.toString());
				}
				System.out.println(Thread.currentThread().getName()+"--code--"+tick--);
			}
		}
	
	}
}



class DeadLockDemo
{
	public static void main(String[] args) 
	{
		Ticket t = new Ticket();

		Thread t1 = new Thread(t);
		Thread t2 = new Thread(t);
//		Thread t3 = new Thread(t);
//		Thread t4 = new Thread(t);

		t1.start();
		try
		{
			Thread.sleep(10);
		}
		catch (Exception e)
		{
			System.out.println(e.toString());
		}

		t.flag =false;
		t2.start();
//		t3.start();
//		t4.start();
	}
}

4、运行结果



第二部分

1、死锁程序

这个程序是a拿着a锁想要进b里面去,b拿着b的锁想要进a来,两者都拿着锁不放,都相持不下;
<span style="font-size:14px;">//面试时要写一个死锁</span><span style="font-size:18px;">
class Test implements Runnable
{
	private boolean flag;
	Test(boolean flag)
	{
		this.flag = flag;
	}
	public void run()
	{
		if(flag)
		{
//			用的是两个同步代码快,进行的验证,a锁里面有b锁,
			synchronized(MyLock.locka)
			{
				System.out.println("if locka");
				synchronized(MyLock.lockb)
				{
					System.out.println("if lockb");
				}
			}
		}
		else
		{
//			用的是两个同步代码块,b锁里面有a锁;
			synchronized(MyLock.lockb)
			{
				System.out.println("else lockb");
				synchronized(MyLock.locka)
				{
					System.out.println("else locka");
				}
			}
		}
	}
}
class MyLock
{
//静态直接有类名进行调用
	static Object locka = new Object();
	static Object lockb = new Object();
}
class DeadLockTest 
{
	public static void main(String[] args) 
	{
		Thread t1 = new Thread(new Test(true));
		Thread t2 = new Thread(new Test(false));
		t1.start();
		t2.start();
	}
}
</span>

2、运行结果



两者都拿着锁都不放,最后就锁住了;
要避免死锁的发生;

第三部分

我的总结

|--死锁的发生就是两个程序都拿着自己的锁,想要进入到对方的锁中,但是两者都是拿着锁不放,相持不下,最后就锁住了;
|--写程序时要避免死锁的发生;
|--死锁在面试的时候,会要求让你写一个死锁出来;









发布了40 篇原创文章 · 获赞 0 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/java9832/article/details/46420315