Java并发编程—死锁

文章目录

  • 死锁
      • 什么叫做加锁?
      • 死锁代码理解:
      • 如何避免死锁?
  • 资源限制的挑战
      • 什么是资源限制?
      • 资源限制引发的问题?
      • 如何解决资源限制的问题?
      • 在资源限制情况下进行并发编程

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

死锁

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

  1. synchronized不能直接在创建变量的地方进行修饰。
  2. 被锁的变量必须是引用类型。
  3. 锁是有锁住的时间的,下图阴影部分是锁住的时间,代码块执行完了就释放锁。
    Java并发编程—死锁_第1张图片

什么叫做加锁?

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

死锁代码理解:

Java并发编程—死锁_第2张图片

  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,因此形成死锁。
    Java并发编程—死锁_第3张图片

如何避免死锁?

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

资源限制的挑战

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

什么是资源限制?

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

资源限制引发的问题?

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

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

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

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

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

你可能感兴趣的:(并发编程,java)