Java 多线程学习总结3

本文通过一个Java示例程序展示了线程死锁的概念及其发生过程。两个线程分别持有不同对象的锁,并尝试获取对方持有的锁,最终导致双方都无法继续执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线程的死锁

 如果多个线程操作多个对象互相请求,那么会引起死锁。

 

package deadlock;

public class SomeBody {
	private String name;
	private SomeBody other;
	public SomeBody(String name)
	{
		this.name=name;
	}
	
	public synchronized void  saySomeThing()
	{
		System.out.println(this.name+"1111111111"+Thread.currentThread());
		//某个对象进入此锁后,休息一会,确保同时另外一个对象已经占有它自己的锁,
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		other.singSomeThing();//让另外一个对象请求它已经占有的锁
		System.out.println(this.name+"222222222222"+Thread.currentThread());
		System.out.println(this.name+"33333333333"+Thread.currentThread());
		System.out.println(this.name+"44444444444"+Thread.currentThread());
	}
	
	public synchronized void singSomeThing()
	{
		System.out.println(this.name+"AAAAAAAAAAA"+Thread.currentThread());
		System.out.println(this.name+"BBBBBBBBBBBBBB"+Thread.currentThread());
//		某个对象进入此锁后,休息一会,确保同时另外一个对象已经占有它自己的锁,
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		other.saySomeThing();//让另外一个对象请求它已经占有的锁
		System.out.println(this.name+"CCCCCCCCCCCC"+Thread.currentThread());
		System.out.println(this.name+"DDDDDDDDDDDDD"+Thread.currentThread());
	}
    public void setOther(SomeBody other)
    {
    	this.other=other;
    }

}

 线程1:

ublic class xiaoming extends Thread{
    private SomeBody somebody;
  
    public xiaoming(SomeBody somebody)
    {
    	this.somebody=somebody;
    	
    }

    public void run()
    {
    	somebody.saySomeThing();
    
    }
}

 

线程2:

package deadlock;

public class dagang extends Thread{
    private SomeBody somebody;
  
    public dagang(SomeBody somebody)
    {
    	this.somebody=somebody;
    	
    }

    public void run()
    {
    	somebody.singSomeThing();
    	
    }

}

  程序入口:

package deadlock;

public class main {
	public static void main(String args[])
	{
		SomeBody mingming=new SomeBody("小明");
		SomeBody ganggang=new SomeBody("大刚");
		mingming.setOther(ganggang);
		ganggang.setOther(mingming);
		
		Thread thread1=new xiaoming(mingming);
		Thread thread2=new dagang(ganggang);
		thread1.start();
		thread2.start();
		
		
	}

}

 

结果:

小明1111111111Thread[Thread-0,5,main]
大刚AAAAAAAAAAAThread[Thread-1,5,main]
大刚BBBBBBBBBBBBBBThread[Thread-1,5,main]

 

 

 解释:

导致各自占有,互相排斥,故死锁了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值