java多线程中死锁情况的一个示例 - 新闻资讯 - 云南小程序开发|云南软件开发|云南网站建设-昆明葵宇信息科技有限公司

159-8711-8523

云南网建设/小程序开发/软件开发

知识

不管是网站,软件还是小程序,都要直接或间接能为您产生价值,我们在追求其视觉表现的同时,更侧重于功能的便捷,营销的便利,运营的高效,让网站成为营销工具,让软件能切实提升企业内部管理水平和效率。优秀的程序为后期升级提供便捷的支持!

您当前位置>首页 » 新闻资讯 » 技术分享 >

java多线程中死锁情况的一个示例

发表时间:2020-10-19

发布人:葵宇科技

浏览次数:37


    下面是逝世锁情况的一个示例代码
package com.qust.demo.money;

class A {

	public synchronized void foo(B b) {
		System.out.println(Thread.currentThread().getName() + " 进入A的foo");
		try {
			Thread.sleep(200);
		} catch (InterruptedException ex) {
			ex.printStackTrace();
		}
		System.out.println(Thread.currentThread().getName() + " 试图调用B的last");
		b.last();
	}

	public synchronized void last() {
		System.out.println("A的last()");
	}
}

class B {

	public synchronized void bar(A a) {
		System.out.println(Thread.currentThread().getName() + " 进入B的bar");
		try {
			Thread.sleep(200);
		} catch (InterruptedException ex) {
			ex.printStackTrace();
		}
		System.out.println(Thread.currentThread().getName() + " 试图调用A的last");
		a.last();
	}

	public synchronized void last() {
		System.out.println("B的last()");
	}
}

public class DeadLock implements Runnable {

	A a = new A();
	B b = new B();

	public void init() {
		Thread.currentThread().setName("主线程");
		System.out.println("进入主线程");
		a.foo(b);
	}

	public void run() {
		Thread.currentThread().setName("副线程");
		System.out.println("进入副线程");
		b.bar(a);
	}

	public static void main(String[] args) {
		DeadLock dl = new DeadLock();
		new Thread(dl).start();
		dl.init();
	}
}

    下面是运行结不雅
进入主线程
进入副线程
主线程 进入A的foo
副线程 进入B的bar
副线程 试图调用A的last
主线程 试图调用B的last

    我们看到,正常情况下,最后还应当打印出“A的last()”和"B的last()",然则因为线程逝世锁的原因,所以法度榜样一向在等待履行,没能正常的履行下去。
    在膳绫擎的代率攀琅绫擎,为什么会出现逝世锁这种情况呢?我们来简单分析一下。
    起首固然副线程的start()是在主线程的init()之前,然则因为多线程开启也须要一段时光,所以我们可以看到,是主线程的init()办法履行在前,然后在init()琅绫擎调用了a.foo()。A类和B类中的办法都是同步办法,是以,A的对象和B的对象都是同步锁。在进入A的foo()之前,线程会对A加锁,然后线程睡眠200ms,这时刻副线程调用B的bar(),同样的会对B加锁,然后睡眠200ms。这时刻,主线程唤醒,试图调用B的bar办法,因为是同步办法,所以须要对B加锁,然则这时刻B已经被副线程锁住了,所以主线程就一向处于壅塞状况。当副线程唤醒的时刻,试图调用A的同步办法,同样须要对A加锁,然则这时刻主线程持有A的锁,并处于壅塞状况,所以副线程也不克不及向下履行,大年夜家都在等着对方释放锁,是以出现了我们膳绫擎说的逝世锁的情况。
    如不雅我们把A和B的last()的synchronized去掉落,那么法度榜样在调用last()之前就不须要对对象进行加锁,也就不会出现逝世锁的情况。
    因为在工作中还没有碰到这种情况,所以只能拿这个实例法度榜样讲解了。

相关案例查看更多