JavaSE8基础 死锁之同步嵌套 简单示例

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaSE8基础 死锁之同步嵌套 简单示例相关的知识,希望对你有一定的参考价值。

礼悟:
           好好学习多思考,尊师重道存感恩。叶见寻根三返一,活水清源藏于零。
           虚怀若谷良心主,皓月当空自在王。愿给最苦行无悔,诚劝且行且珍惜。




    os :windows7 x64
    jdk:jdk-8u131-windows-x64
    ide:Eclipse Oxygen Release (4.7.0)



继承Thread的子类:

package blog.jizuiku1;

/*
 * @author jizuiku 
 * @version V17.09.27
 */
public class DieLock extends Thread {

	// 因为是 用同步嵌套演示死锁,所以 需要创建两把锁
	private static Object lockA = new Object();
	private static Object lockB = new Object();

	// 创建一个标记,它和if-else配套使用会有很巧妙的效果
	private boolean flag;

	public DieLock(boolean flag) {
		super();
		this.flag = flag;
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		while (true) {

			// 如果一个线程的flag是true,它抢到执行权后,会将lockA锁上
			// 同时,另一个线程的flag是false,它抢到执行权后,会将lockB锁上
			// 于是,第一个线程只有在lockB解锁的情况下才能往下走
			// 可尴尬的是,第二个线程只有在lockA解锁的情况下才能往下走
			// 于是,这两个线程就开始漫长的等待......
			// 得不到的就放下吧.........执着下去的话,一生就过去了.
			
			if (flag) {
				synchronized (lockA) {
					// 线程要想到这里来,则需要lockA是解开的
					// 当线程到这里来之后,lockA就被锁上了
					System.out.println("flag=true,lockA");
					synchronized (lockB) {
						System.out.println("flag=true,lockB");
					}
				}
			} else {
				synchronized (lockB) {
					// 线程要想到这里来,则需要lockB是解开的
					// 当线程到这里来之后,lockB就被锁上了
					System.out.println("flag=flase,lockB");
					synchronized (lockA) {
						System.out.println("flag=flase,lockA");
					}
				}
			}
		}
	}

}

 
测试类:

package blog.jizuiku1;

/*
 * @author jizuiku 
 * @version V17.09.27
 */
public class DieLockDemo {
	public static void main(String[] args) {
		DieLock dl1 = new DieLock(true);
		DieLock dl2 = new DieLock(false);

		dl1.start();
		dl2.start();
	}
}

 
结果:    
技术分享

 


感想:
  看了这一幕,给最苦 不由得想到了 两仪图

技术分享

 

 


Java优秀,值得学习。
学习资源:itcast和itheima视频库。如果您有公开的资源,可以分享给我的话,用您的资源学习也可以。
博文是观看视频后,融入思考写成的。博文好,是老师讲得好。博文坏,是 给最苦 没认真。
















以上是关于JavaSE8基础 死锁之同步嵌套 简单示例的主要内容,如果未能解决你的问题,请参考以下文章

JavaSE8基础 静态代码块 简单示例

JavaSE8基础 方法重写简单示例

JavaSE8基础 函数返回一个匿名对象 简单示例

JavaSE8基础 具体类实现多个接口 简单示例

JavaSE8基础 父子类中都有静态代码块与构造代码块,执行顺序的简单示例

JavaSE8基础 继承一个抽象类的简单示例