版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yerenyuan_pku/article/details/82670716
死锁的概述
死锁就是指同步中嵌套同步。
死锁的案例
以卖票程序为例来演示死锁情况。
class SaleTicket implements Runnable
{
private int tickets = 1000;
//定义一个boolean标记。
boolean flag = true;
Object obj = new Object();
public void run()
{
if (flag)
while (true)
{
synchronized (obj)//obj lock
{
sale();//this lock
}
}
else
while (true)
sale();
}
public synchronized void sale()//this lock
{
synchronized (obj)//obj lock
{
if (tickets > 0)
{
try {Thread.sleep(10);} catch (InterruptedException e) {}//让线程到这里稍微停一下。
System.out.println(Thread.currentThread().getName() + "....func...." + tickets--);
}
}
}
}
class DeadLockDemo
{
public static void main(String[] args) throws InterruptedException
{
//线程任务对象。
SaleTicket t = new SaleTicket();
//创建四个线程。通过Thread类的对象。
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
t1.start();
Thread.sleep(10);//让主线程睡10s,此刻能运行的线程只有t1
t.flag = false;
//主线程醒了之后,t1和t2线程同时运行
t2.start();
}
}
面试题:写一个死锁程序
这里有一个面试题,写一个死锁程序。如果你能写出来,说明你对多线程这门技术多少有一些了解了。为方便大家参考,下面我给出一个死锁示例。
class Task implements Runnable
{
private boolean flag;
Task(boolean flag)
{
this.flag = flag;
}
public void run()
{
if (flag)
{
while (true)
synchronized (MyLock.LOCKA)
{
System.out.println("if......locka");
synchronized (MyLock.LOCKB)
{
System.out.println("if......lockb");
}
}
}
else
{
while (true)
synchronized (MyLock.LOCKB)
{
System.out.println("else......lockb");
synchronized (MyLock.LOCKA)
{
System.out.println("else......locka");
}
}
}
}
}
class MyLock
{
public static final Object LOCKA = new Object();
public static final Object LOCKB = new Object();
}
class DeadLockTest
{
public static void main(String[] args)
{
//创建线程任务
Task t1 = new Task(true);
Task t2 = new Task(false);
new Thread(t1).start();
new Thread(t2).start();
}
}