死锁产生原因:
项目代码比较繁琐,多线程应用里有可能会发生死锁
死锁在数据库里的解释更为清晰全面 且难度也是很大 概念难懂
以下是错误的死锁范例:
class fileguy {
public static void main(String[] args) {
players P1=new players("sd",3,3);
players P2=new players("sd1",2,3);
Thread t1=new Thread()
{
public void run()
{
try
{
synchronized(P1)
{
System.out.println("占用P1");
}//也就是这里执行完毕就已经释放P1了
Thread.sleep(1000);
System.out.println("试图占用P2");
}catch(InterruptedException e)
{
e.printStackTrace();
}
System.out.println("t1 等待中 。。。。");
synchronized (P2) {
System.out.println("do it?");
}//而P2还未被占用 所以会执行其中的语句
}
};
t1.start();
Thread t2=new Thread()
{
public void run()
{
try
{
synchronized(P2)
{
System.out.println("占用P2");
}//也就是这里执行完毕就已经释放P2了
Thread.sleep(1000);
System.out.println("试图占用P1");
}catch(InterruptedException e)
{
e.printStackTrace();
}
System.out.println("t2 等待中 。。。。");
synchronized (P1) {
System.out.println("do it also?");
}//在那一刻P1已经被释放 所以可以执行其中的语句
}
};
t2.start();
}
}
以上并没用发生死锁只是看起来发生了…
以下是正确的死锁案例:
class fileguy {
public static void main(String[] args) {
players P1=new players("sd",3,3);
players P2=new players("sd1",2,3);
Thread t1=new Thread()
{
public void run()
{
synchronized(P1)
{
System.out.println("占用P1");
try
{
Thread.sleep(1000);
System.out.println("试图占用P2");
}catch(InterruptedException e)
{
e.printStackTrace();
}
System.out.println("t1 等待中 。。。。");
synchronized (P2) {
System.out.println("do it?");
}
}
}
};
t1.start();
Thread t2=new Thread()
{
public void run()
{
synchronized(P2)
{
System.out.println("占用P2");
try
{
Thread.sleep(1000);
System.out.println("试图占用P1");
}catch(InterruptedException e)
{
e.printStackTrace();
}
System.out.println("t2 等待中 。。。。");
synchronized (P1) {
System.out.println("do it also?");
}
}
}
};
t2.start();
}
}
- 线程1 首先占有对象P1,接着试图占有对象P2
- 线程2 首先占有对象P2,接着试图占有对象P1
- 线程1 等待线程2释放对象P2
- 与此同时,线程2等待线程1释放对象P1
- 就这样 两个互相等着 等到…
勘误:
对于synchronized 块语句 所包含的代码段为占用该对象后要执行的功能直到执行完毕 才会释放该对象(对于synchronized有个更全面的认识) 所以产生死锁由代码段来看 是一个synchronized块语句占用了该对象在其中又包含了占用其他对象的synchronized块语句 这是synchronized语句的嵌套 写法允许可是问题就出现在两个线程类实例同时进行synchronized块语句嵌套 试图占用对方的对象 进而发生死锁