/*思路:两个或多个线程,同时访问一个资源,为了避免某一点几个线程同时操作一个数据,造成错误,就实行了同步机制,锁定同一个数据某一点只让一个线程进行操作,
结束之后再由其他线程进行操作,这样就提高了多线程的安全性,但这样的操作也存在局限性,就是每一次访问都要查看是否已同步锁,就会造成步骤繁琐.若线程过长,这样就相似于单线程;
所以就采用了分段同步的方法提高效率,尽量缩短线程同步运算的时间,来提高效率.
这样也有一个弊端,就是当同步锁过多时,两个线程同步中需要互相访问对方的同步锁,在对方没有解锁的情况下自己不能访问,自己不解锁的情况下,对方又不能访问,这就造成了死锁现象.
实际开发中要避免死锁的发生,这样的现象多发生在嵌套同步之中,下面是一个很简单的双重同步锁嵌套死锁.*/
public class 死锁练习 {
public static void main(String[] args) {//当A门B门同时打开时就会死锁
双重门 t=new 双重门();
Thread t1=new Thread(t);
Thread t2=new Thread(t);
t1.start();
t2.start();
}
}
class 双重门 implements Runnable
{ boolean a=true; //从A到B属于true状态,从B到A属于false状态
Object A=new Object();//设置两个门,双重门
Object B=new Object();
public void run(){
while("开始循环"!=null ){
if (a==true)
{
synchronized(A)
{System.out.println(Thread.currentThread().getName()+"拿到A钥匙进入A门去往B门");//此处是一个房间有两个门, A门和B门,经过之后A门会自动上锁,且不能回头且每个门有 //且只有一把钥匙.
// 拿到B门的钥匙之后,打开B门离开房间.此时A门钥匙释放;
synchronized (B)
{
System.out.println(Thread.currentThread().getName()+"从B门出来");
}
}
a=false;
}
else {
synchronized (B){
System.out.println(Thread.currentThread().getName()+"拿到B钥匙从B进入去往A门");//此处是一个房间有两个门, A门和B门,经过之后B门会自动上锁,且不能回头且每个门有 //且只有一把钥匙.
// 拿到A门的钥匙之后,打开A门离开房间.此时B门钥匙释放;
synchronized(A){
System.out.println(Thread.currentThread().getName()+"从A门出来");
}
}
a=true;
}
}
}
}
------- android培训、java培训、期待与您交流! ----------