您的位置:首页 > 其它

多线程死锁问题(this锁和普通锁区别)

2013-10-19 11:24 134 查看
需求:写一个多线程死锁程序。思路:1、创建一个类Test 实现Runnable接口,并把任务封装到run()方法中。2、任务代码中用到两个同步代码块,并实现任务切换,来实现死锁。3,或者用同步函数和同步代码块,但能发现this锁的特殊。
第一种方法是,用两个同步代码块嵌套,来实现死锁。
package cm;

public class DeadLock {
public static void main(String []args){

Test t=new Test();
Thread s=new Thread(t,"one");
Thread s1=new Thread(t,"two");
s.start();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

t.flag=false;
s1.start();

}

}
class Test implements Runnable{
boolean flag=true;
Object obj =new Object();
Object obj1 =new Object();
public void run() {
if(flag)
{
while(true)
{	synchronized(obj){

System.out.println(Thread.currentThread()+"...lock obj.....");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized(obj1){
System.out.println(Thread.currentThread()+".....lock obj1.....");
}
}

}

}
else
while(true)
show();

}
private  void show() {
synchronized(obj1){
System.out.println(Thread.currentThread()+"obj1 lock....");
synchronized(obj){
System.out.println(Thread.currentThread()+"obj lock.....");

}
}
}

}
第二种死锁方式:
同步函数和同步代码块嵌套,可以发现的不同之处是。this锁由于是指向本类对象,故可以被同一个对象调用的同步函数同时持有
,而不排斥,普通锁只能被一个所持有,也就是说,s线程拿到了this锁同时,不影响s1线程拿到this锁。。package cm;public class DeadLock {public static void main(String []args){Test t=new Test();Thread s=new Thread(t,"one");Thread s1=new Thread(t,"two");s.start();try {Thread.sleep(10);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}t.flag=false;s1.start();}}class Test implements Runnable{boolean flag=true;Object obj =new Object();public void run() {if(flag){while(true){synchronized(obj){System.out.println(Thread.currentThread()+"...lock obj.....");try {Thread.sleep(10);}catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}show();}}}elsewhile(true)show();}private  void show() {System.out.println(Thread.currentThread()+"this lock....");synchronized(obj){System.out.println(Thread.currentThread()+"obj lock.....");}}}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: