首页 > 其他分享 >死锁

死锁

时间:2023-07-29 12:44:05浏览次数:39  
标签:num1 sum 死锁 num mutex 线程

 1 import threading
 2 
 3 
 4 # 全局变量
 5 g_num = 0
 6 
 7 
 8 # 对g_num进行加操作
 9 def sum_num1():
10     # 上锁
11     print("sun_num1...")
12     print(f"sum_num1 id(mutex) {id(mutex)}")
13     mutex.acquire()
14 
15     for i in range(1000000):
16         global g_num
17         g_num += 1
18 
19     print("g_num1:", g_num)
20 
21 
22 # 对g_num进行加操作
23 def sum_num2():
24     # 上锁
25     print("sun_num2...")
26     print(f"sum_num2 id(mutex) {id(mutex)}")
27     mutex.acquire()  # 没有释放
28 
29     for i in range(1000000):
30         global g_num
31         g_num += 1
32 
33     print("g_num2:", g_num)
34 
35 
36 if __name__ == '__main__':
37     # 创建锁
38     mutex = threading.Lock()  # 全局变量
39     print(id(mutex))
40     # 创建子线程
41     sum1_thread = threading.Thread(target=sum_num1)
42     sum2_thread = threading.Thread(target=sum_num2)
43 
44     # 启动线程
45     sum1_thread.start()
46     sum2_thread.start()

输出:

2590825403712
sun_num1...
sum_num1 id(mutex) 2590825403712
sun_num2...
sum_num2 id(mutex) 2590825403712
g_num1: 1000000

从输出结果上看是同一把锁。锁主了。

2个线程都争取上锁(只能1个成功),成功后没有释放,导致另外一个线程一直等待(拿到锁的线程已经执行完了还是在等待)

总结

死锁发生的条件通常包括以下四个必要条件:

  1. 互斥条件(Mutual Exclusion):一个资源同时只能被一个线程或进程占用。
  2. 请求和保持条件(Hold and Wait):一个线程或进程在持有某个资源的同时,还请求其他资源。
  3. 不可剥夺条件(No Preemption):一个资源不能被强制从一个线程或进程中释放,只能由持有该资源的线程或进程主动释放。
  4. 循环等待条件(Circular Wait):多个线程或进程形成一个循环等待其他线程或进程所持有的资源。

避免死锁的最佳实践包括:

  1. 避免使用过多的锁。尽量简化并发代码,减少需要加锁的地方。
  2. 使用适当的锁粒度。将锁的范围控制在最小必要范围内,以降低死锁的概率。
  3. 避免嵌套锁。如果一个线程已经持有了一个锁,在持有的锁范围内尽量不要再去请求其他锁。
  4. 使用定时锁(Timeout Locks)。在加锁时设置超时时间,避免线程永久等待锁的释放。
  5. 使用死锁检测和恢复机制。可以周期性地检测死锁的发生,并采取相应的措施进行恢复,例如强制释放某些资源或回滚操作。

标签:num1,sum,死锁,num,mutex,线程
From: https://www.cnblogs.com/allenxx/p/17589648.html

相关文章

  • MySql —— 死锁场景
    参考:小林coding: https://xiaolincoding.com/mysql/lock/deadlock.html出世&入世:https://blog.csdn.net/weixin_54828627/article/details/129379140 死锁的四个必要条件:互斥占有且等待不可强占用循环等待一、批量更新/删除数据-同时加锁记录多InnoDB是边扫描边加锁......
  • mysql分区表导致的死锁
    死锁异常:org.springfreamwork.dao.DeadlockLoserDataAccessException:......Cause:java.sql.BatchUpdateException:Deadlockfoundwhentryingtogetlock;tryrestartingtransactionat.....1、java代码如下@Transactionalpublicvoidhandle(){selectDao.select1(...);......
  • mysql update死锁
    如何实现“mysqlupdate死锁”引言MySQL的死锁是指两个或多个事务相互等待对方释放资源而无法继续执行的情况。在开发中,我们需要了解如何实现死锁,以便更好地理解死锁产生的原因,并能够针对性地解决这类问题。本文将介绍如何使用MySQL实现一个简单的update死锁场景,并提供相应的代码......
  • mysql8.0查询死锁语句
    如何实现“mysql8.0查询死锁语句”简介在开发过程中,我们经常会遇到数据库死锁的情况。死锁是指两个或多个事务互相持有对方所需要的资源,导致事务无法继续执行的情况。MySQL8.0提供了一种查看当前死锁情况的方法,以便我们能够定位和解决问题。本文将详细介绍如何在MySQL8.0中......
  • Python 潮流周刊#12:Python 中如何调试死锁问题?
    查看全文:https://pythoncat.top/posts/2023-07-22-weekly......
  • MySQL锁机制与解决死锁问题
    引言:在数据库中,锁是一种重要的机制,用于控制并发访问数据,保证数据的一致性和完整性。MySQL作为一种常用的关系型数据库,也提供了丰富的锁机制来处理多个用户同时访问数据库时可能出现的并发问题。本篇博客将介绍MySQL的锁机制,包括如何添加锁以及解决可能出现的死锁问题。1.介绍MySQ......
  • linux9 互斥锁 死锁 读写锁 条件变量 信号量
    1.linux9day1.线程竞争![01-打印机模型](I:\9day\01-打印机模型.png)2.同步和互斥互斥同一时刻只能一个进程或线程使用多个进程或线程不能同时使用同步:是指散步在不同任务之间的若干程序片断,它们的运行必须严格按照规定的某种先后次序来运行,这种先后次序依赖于要完成的特......
  • 手写死锁&&死锁的原因是什么?如何快速定位死锁?如何避免死锁
    一个简单的死锁案例:packagemylock;publicclassDeadlockExample{publicstaticvoidmain(String[]args){finalObjectresource1=newObject();finalObjectresource2=newObject();//线程1占用资源1,等待资源2Threadth......
  • 死锁、活锁
    Java死锁是指两个或多个线程被无限期地阻塞,等待对方释放其持有的资源,导致程序无法继续执行下去的现象。Java死锁通常发生在多个线程之间,其中一个线程持有某个资源,但是同时需要另一个资源,但是该资源被其他线程持有,导致它无法继续执行。为了避免死锁,Java提供了一些机制来避免和解决......
  • 数据库死锁原因以及解决
    有一篇讲了mvcc的基本原理:https://www.cnblogs.com/benjerry/p/17551031.html这样就知道最简单的死锁产生原因,就是有两个并发事务,事务1先更新a表某行数据,再更新b表某行数据,事务2先更新b表同行数据,再更新a表同行数据,就非常有可能死锁了。还有种写法,selectforupdate,将共享锁上升......