Java并发编程—死锁


——————————————————————————————

死锁

调用非静态的方法需要new一个方法的对象,synchronized(A)表示锁住了变量A;

  1. synchronized不能直接在创建变量的地方进行修饰。
  2. 被锁的变量必须是引用类型。
  3. 锁是有锁住的时间的,下图阴影部分是锁住的时间,代码块执行完了就释放锁。
    在这里插入图片描述

什么叫做加锁?

  1. 现在有两个资源A和B,两个线程t1,t2;t1给资源A加锁后,其他资源无法读和操作资源A,只有t1可以对资源A进行读写;
  2. 锁内部实现的原理也是给资源加了一个标记(约定),加锁的资源其他线程就不能访问了;
  3. cpu给t1分配的时间片结束后去执行其他线程时,锁也不会释放,其他线程依然不能访问资源A。

死锁代码理解:

在这里插入图片描述

  1. t1先进入就绪态,cpu分配时间片给t1,t1锁住A,t1的时间片结束;
  2. cpu分配时间片给t2,t2进入就绪态,t2锁住B,t2想锁住A,无法对A操作,进入等待状态,t2的时间片结束;
  3. cpu分配时间片给t1,t1睡眠时间结束,想锁住B,无法对B操作,进入等待状态,t1的时间片结束;
  4. cpu分配时间片给t2,t2一直等待锁住A,cpu分配时间片给t1,t1一直等待锁住B,因此形成死锁。
    在这里插入图片描述

如何避免死锁?

  1. 避免一个线程同时获取多个锁。
  2. 避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源。
  3. 尝试使用定时锁,使用lock.tryLock(timeout)来替代使用内部锁机制。
  4. 对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况。

资源限制的挑战

cpu产生浪费的时候,如果是要提高性能的话,适合使用多线程,并不是所有情况都适合用多线程

什么是资源限制?

资源限制是指在进行并发编程时,程序的执行速度受限于计算机硬件资源或软件资源。

资源限制引发的问题?

在并发编程中,将代码执行速度加快的原则是将代码中串行执行的部分变成并发执行,但是如果将某段串行的代码改成并发执行,因为资源受限,所以实际上仍然在串行执行,这时候程序不仅不会加快执行,反而会更慢,因为增加了上下文切换和资源调度的时间。

如何解决资源限制的问题?

  • 对于硬件资源限制,可以考虑使用集群并行执行程序。单机—>多机集群
  • 对于软件资源限制,可以考虑使用资源池将资源复用。

在资源限制情况下进行并发编程

如何在资源限制的情况下,让程序执行得更快呢?
==》根据不同的资源限制调整
程序的并发度;
例:下载文件程序依赖于两个资源——带宽和硬盘读写速度。
有数据库操作时,涉及数据库连接数,如果SQL语句执行非常快,而线程的数量比数据库连接数大很多,则某些线程会被阻塞,等待数据库连接。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值