java线程死锁代码示例

 更新时间:2017年11月24日 08:38:17   作者:rese-t  
这篇文章主要介绍了java线程死锁代码示例,分享了一个简单线程死锁的例子,需要的朋友可以参考下。

死锁是操作系统层面的一个错误,是进程死锁的简称,最早在 1965 年由 Dijkstra 在研究银行家算法时提出的,它是计算机操作系统乃至整个并发程序设计领域最难处理的问题之一。

事实上,计算机世界有很多事情需要多线程方式去解决,因为这样才能最大程度上利用资源,才能体现出计算的高效。但是,实际上来说,计算机系统中有很多一次只能由一个进程使用的资源的情况,例如打印机,同时只能有一个进程控制它。在多通道程序设计环境中,若干进程往往要共享这类资源,而且一个进程所需要的资源还很有可能不止一个。因此,就会出现若干进程竞争有限资源,又推进顺序不当,从而构成无限期循环等待的局面。我们称这种状态为死锁。简单一点描述,死锁是指多个进程循环等待它方占有的资源而无限期地僵持下去的局面。很显然,如果没有外力的作用,那么死锁涉及到的各个进程都将永远处于封锁状态。

文件名:DeadThreadByExtend.java

注:

1、起线程的时候用的是start方法,run方法也可以调用,但是仅仅相当于普通调用,在当前线程内执行。

2、synchronized 不能直接修饰变量。

3、synchronized 块并不会强制块内变量的单线程访问。仅仅意味着在执行块内语句时锁住synchronized (args)的参数,直到执行结束才释放。

package com.ycf.study.thread;
class Sources{
	int a;
	public void setA(int x) {
		synchronized (this) {
			this.a = x;
			try {
				Thread.sleep(2000);
			}
			catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}
public class DeadThreadByExtend {
	public static void main(String[] args) {
		Sources s1 = new Sources();
		Sources s2 = new Sources();
		class MyThread1 extends java.lang.Thread {
			@Override
			      public void run() {
				System.out.println("线程1开始");
				synchronized (s1) {
					System.out.println("线程1申请修改s1");
					s1.setA(20);
					System.out.println("线程1修改完成");
					System.out.println("线程1申请修改s2");
					s2.setA(10);
					System.out.println("线程1修改s2完成");
				}
				System.out.println("线程1退出并释放锁++++++++++");
			}
		}
		class MyThread2 extends java.lang.Thread {
			@Override
			      public void run() {
				System.out.println("线程2开始");
				synchronized (s2) {
					System.out.println("线程2申请修改s2");
					s2.setA(20);
					System.out.println("线程2修改s2完成");
					System.out.println("线程2申请修改s1");
					s1.setA(10);
					System.out.println("线程2修改s1完成");
				}
				System.out.println("线程2退出并释放锁++++++++++");
			}
		}
		MyThread1 mt1 = new MyThread1();
		MyThread2 mt2 = new MyThread2();
		mt1.start();
		mt2.start();
	}
}

总结

以上就是本文关于java线程死锁代码示例的全部内容,希望对大家有所帮助。如有不足之处,欢迎留言指出。感谢朋友们对本站的支持。

相关文章

  • Java对敏感数据进行加密的方法详解

    Java对敏感数据进行加密的方法详解

    敏感数据的加密是数据安全的重要方面,尤其是对于手机号和身份证号这类个人信息,本文主要为大家介绍了Java对敏感数据进行加密的相关方法,希望对大家有所帮助
    2024-03-03
  • Java中如何正确定义字符串

    Java中如何正确定义字符串

    这篇文章主要给大家介绍了关于Java中如何正确定义字符串的相关资料,在Java中定义一个字符串最简单的方法是用双引号把它包围起来,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-10-10
  • Idea 搭建Spring源码环境的超详细教程

    Idea 搭建Spring源码环境的超详细教程

    这篇文章主要介绍了Idea 搭建Spring源码环境,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • Java代理模式之静态代理与动态代理的区别及优缺点

    Java代理模式之静态代理与动态代理的区别及优缺点

    代理模式是一种常用的设计模式,它允许通过引入一个代理对象来控制对目标对象的访问,在Java中,代理模式被广泛应用,它可以提供额外的功能,如权限检查、缓存、日志记录等,本文将介绍静态代理与动态代理的区别及优缺点,需要的朋友可以参考下
    2023-06-06
  • java selenium教程环境搭建基于Maven

    java selenium教程环境搭建基于Maven

    本文主要介绍Java selenium 环境的安装,这里介绍了基于Maven的环境搭建,有需要的小伙伴可以参考下
    2016-08-08
  • SpringBoot配置SwaggerUI访问404错误的解决方法

    SpringBoot配置SwaggerUI访问404错误的解决方法

    这篇文章主要为大家详细介绍了SpringBoot配置SwaggerUI访问404错误的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • Spring aop+反射实现电话号加密

    Spring aop+反射实现电话号加密

    线上项目涉及大量查询接口中,存在电话号明文展示不合规的问题。如果对每个接口返回结果中电话号相关字段修改相关代码逻辑,则工作量较大花费时间多。因此设计电话号加密注解,减少工作量。
    2021-06-06
  • 详解JAVA 连等赋值问题

    详解JAVA 连等赋值问题

    这篇文章主要介绍了JAVA 连等赋值问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • 解决SpringMVC接收不到ajaxPOST参数的问题

    解决SpringMVC接收不到ajaxPOST参数的问题

    今天小编就为大家分享一篇解决SpringMVC接收不到ajaxPOST参数的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • Spring容器中已经存在的Bean替换示例

    Spring容器中已经存在的Bean替换示例

    这篇文章主要为大家介绍了Spring容器中已经存在的Bean替换示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06

最新评论