当前位置: 首页 > news >正文

阿里巴巴吧做网站网页的设计与应用的论文

阿里巴巴吧做网站,网页的设计与应用的论文,文字设计成图形logo,后台管理系统登录入口死锁是指两个或两个以上的进程(线程)在执行过程中,由于竞争资 源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推 进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相…
死锁是指两个或两个以上的进程(线程)在执行过程中,由于竞争资
源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推
进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进
程(线程)称为死锁进程(线程)。
多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线
程被无限期地阻塞,因此程序不可能正常终止。
如下图所示,线程 A 持有资源 2,线程 B 持有资源 1,他们同时都想申请对方
的资源,所以这两个线程就会互相等待而进入死锁状态。

下面通过一个例子来说明线程死锁,代码模拟了上图的死锁的情况

 

public class DeadLockDemo {private static final Object resource1 = new Object();//资源 1private static final Object resource2 = new Object();//资源 2public static void main(String[] args) {new Thread(() -> {synchronized (resource1) {System.out.println(Thread.currentThread().getName() + "get resource1");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "waiting get resource2");synchronized (resource2) {System.out.println(Thread.currentThread().getName() + "get resource2");}}}, "线程 1---").start();new Thread(() -> {synchronized (resource2) {System.out.println(Thread.currentThread().getName() + "get resource2");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "waiting get resource1");synchronized (resource1) {System.out.println(Thread.currentThread().getName() + "get resource1");}}}, "线程 2---").start();}
}

 输出结果:

线程 1---get resource1
线程 2---get resource2
线程 2---waiting get resource1
线程 1---waiting get resource2
线程 A 通过 synchronized (resource1) 获得 resource1 的监视器锁,然后通
Thread.sleep(1000) ;让线程 A 休眠 1s 为的是让线程 B 得到CPU执行权,然
后获取到 resource2 的监视器锁。线程 A 和线程 B 休眠结束了都开始企图请求
获取对方的资源,然后这两个线程就会陷入互相等待的状态,这也就产生了死
锁。上面的例子符合产生死锁的四个必要条件。
  • 形成死锁的四个必要条件是什么

1. 互斥条件:线程(进程)对于所分配到的资源具有排它性,即一个资源只
能被一个线程(进程)占用,直到被该线程(进程)释放
2. 请求与保持条件:一个线程(进程)因请求被占用资源而发生阻塞时,对
已获得的资源保持不放。
3. 不剥夺条件:线程(进程)已获得的资源在末使用完之前不能被其他线程
强行剥夺,只有自己使用完毕后才释放资源。
4. 循环等待条件:当发生死锁时,所等待的线程(进程)必定会形成一个环
路(类似于死循环),造成永久阻塞
  • 如何避免线程死锁

我们只要破坏产生死锁的四个条件中的其中一个就可以了。
破坏互斥条件
这个条件我们没有办法破坏,因为我们用锁本来就是想让他们互斥的(临界资源 需要互斥问)。
破坏请求与保持条件
一次性申请所有的资源。
破坏不剥夺条件
占用部分资源的线程进一步申请其他资源时,如果申请不到,可以主动释放它占 有的资源。
破坏循环等待条件
靠按序申请资源来预防。按某一顺序申请资源,释放资源则反序释放。破坏循环 等待条件。
我们对线程 2 的代码修改成下面这样就不会产生死锁了。
    new Thread(() -> {synchronized (resource1) {System.out.println(Thread.currentThread().getName() + "get resource1");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "waiting get resource2");synchronized (resource2) {System.out.println(Thread.currentThread().getName() + "get resource2");}}
}, "线程 2---").start();
输出结果
线程 1---get resource1
线程 1---waiting get resource2
线程 1---get resource2
线程 2---get resource1
线程 2---waiting get resource2
线程 2---get resource2
我们分析一下上面的代码为什么避免了死锁的发生?
线程 1 首先获得到 resource1 的监视器锁,这时候线程 2 就获取不到了。然后
线程 1 再去获取 resource2 的监视器锁,可以获取到。然后线程 1 释放了对
resource1、resource2 的监视器锁的占用,线程 2 获取到就可以执行了。这样
就破坏了破坏循环等待条件,因此避免了死锁。
http://www.yayakq.cn/news/575308/

相关文章:

  • 对网站建设的讲话京津冀协同发展10周年
  • 做网站运营怎么样网站设计策划案
  • 手机wap网站开发的cms系统wordpress 更改数据库密码错误
  • 什么网站可以做兼职 知乎石家庄免费网站制作
  • 铲车找事做找哪些网站网页搜索引擎优化技术
  • 社交网站只做网页定制开发费用
  • 介绍公司的网站有哪些触摸屏html网站
  • 怎么做一个电商网站网页打不开的解决方法
  • 富阳建设局网站做excel的网站
  • 网站开发哪一种语言好外贸网站做SEO
  • 沈阳建设局网站首页南郊做网站
  • 网站开发的最后五个阶段企业网站查询系统官网
  • 微信小程序模板使用如何做网站排名优化
  • 网站开发需有没有著作权专门做照片的网站
  • 网站域名空间多少钱中国菲律宾足球时间
  • 视频网站顶部效果怎么做的网站上传面板
  • 廊坊网站建设策划威海外贸建站
  • 福建省漳州市建设局网站可以申请免费的个人网站吗
  • 建设银行辽宁招聘网站一个域名可以绑定几个网站
  • 建设公司怎么做网站运营重庆点优建设网站公司吗
  • 广州网站开发解决方案如何做网站网页费用
  • 合伙开公司建设网站被骗网站建设罒金手指下拉壹陆
  • 平台网站建设哪家有wordpress应用微信支付
  • php做学校网站免费在线制作表情包工具
  • 跨境电商开店要多少钱seo排名助手
  • 茶叶企业网站建设楚雄州城乡建设局网站
  • 网站如何跟域名绑定东莞网站建设牛魔网a
  • 网站建设综合实训案例晋城市 制作网站
  • 包装设计灵感网站百度权重排名分析
  • 一步一步教你做网站做外贸网站用什么空间