需求:写一个多线程死锁程序。
思路: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 block
e.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 block
e.printStackTrace();
}
show();
}
}
}
else
while(true)
show();
}
private void show() {
System.out.println(Thread.currentThread()+"this lock....");
synchronized(obj){
System.out.println(Thread.currentThread()+"obj lock.....");
}
}
}