广告
返回顶部
首页 > 资讯 > 后端开发 > GO >Go 语言中的死锁问题解决
  • 887
分享到

Go 语言中的死锁问题解决

2024-04-02 19:04:59 887人浏览 薄情痞子
摘要

目录死锁如何避免死锁死锁代码死锁 死锁的4个条件 不可剥夺 线程已经获得的资源,在未使用完之前,不能被其他线程剥夺,只能在使用完后自己释放。 请求保持 线程

死锁

死锁的4个条件

  • 不可剥夺

线程已经获得的资源,在未使用完之前,不能被其他线程剥夺,只能在使用完后自己释放。

  • 请求保持

线程 T1 保持了一个资源 R1 占用,但是又提出另外一个资源 R2 请求,此时,资源 R2 被线程 T2 占用,于是 T1 线程必须等待,但又对自己保持的 R1 资源不释放。

  • 循环等待

死锁发生时,必然存在一个 “进程-资源环形链”,例如 进程p0 等待 p1 占用资源,p1 等待 p2 占用的资源, p2 等待 p0 占用的资源,形成了一个环形链。

  • 互斥

线程对资源访问是排斥的,如果一个线程占用了资源,那么其他线程必须处于等待状态,直到资源释放。

如何避免死锁

如果并发的查询多个表,要约定好访问顺序

不能线程 T1 先访问表 A 后访问表 B,线程T2 先访问 表B 后访问 表A, 这个情况极容易死锁。

  • 在同一个事务中,尽可能一次锁定获取所需要的资源
  • 对于容易产生死锁的业务场景, 尝试升级锁的力度
  • 采用分布式锁或者使用乐观锁

死锁代码


package sync

import (
   "fmt"
   "runtime"
   "sync"
   "testing"
   "time"
)
type value struct {
   meMaccess sync.Mutex
   value     int
}
func TestDeadLock(t *testing.T) {
   runtime.GoMAXPROCS(3)
   var wg sync.WaitGroup
   sum := func(v1, v2 *value) {
      defer wg.Done()
      v1.memAccess.Lock()  // 锁 v1
      time.Sleep(2 * time.Second)
      v2.memAccess.Lock() //锁 v2
      fmt.Printf("sum = %d\n", v1.value+v2.value)
      v2.memAccess.Unlock()
      v1.memAccess.Unlock()
   }
   product := func(v1, v2 *value) {
      defer wg.Done()
      v2.memAccess.Lock() // 锁 v2
      time.Sleep(2 * time.Second)
      v1.memAccess.Lock() // 锁 v1
      fmt.Printf("product = %d\n", v1.value*v2.value)
      v1.memAccess.Unlock()
      v2.memAccess.Unlock()
   }
   var v1, v2 value
   v1.value = 1
   v2.value = 1
   wg.Add(2)
   go sum(&v1, &v2)
   go product(&v1, &v2)
   wg.Wait()
}

运行结果

=== RUN   TestDeadLock
fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan receive]:
testing.(*T).Run(0xc000122480, 0x116dd2c, 0xc, 0x1176e68, 0x1084de6)
 /usr/local/go/src/testing/testing.go:1240 +0x2da
testing.runTests.func1(0xc000122300)
 /usr/local/go/src/testing/testing.go:1512 +0x78
testing.tRunner(0xc000122300, 0xc00012dde0)
 /usr/local/go/src/testing/testing.go:1194 +0xef
testing.runTests(0xc0001320d8, 0x12540e0, 0x1, 0x1, 0x0, 0x0, 0x0, 0x116e218)
 /usr/local/go/src/testing/testing.go:1510 +0x2fe
testing.(*M).Run(0xc00014c080, 0x0)
 /usr/local/go/src/testing/testing.go:1418 +0x1eb
main.main()
 _testmain.go:51 +0x138

可以看到上述运行结果中出现 fatal error: all goroutines are asleep - deadlock!  线程T1 先获得v1 ,然后获得v2, 线程T2 先获得v2,然后获得v1。这样满足了死锁循环等待等条件,会造成死锁。

到此这篇关于Go 语言中的死锁问题解决的文章就介绍到这了,更多相关Go 死锁内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: Go 语言中的死锁问题解决

本文链接: https://www.lsjlt.com/news/133593.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Go 语言中的死锁问题解决
    目录死锁如何避免死锁死锁代码死锁 死锁的4个条件 不可剥夺 线程已经获得的资源,在未使用完之前,不能被其他线程剥夺,只能在使用完后自己释放。 请求保持 线程...
    99+
    2022-11-12
  • 如何解决Go语言中的死锁问题?
    如何解决Go语言中的死锁问题?Go语言具有并发编程的特性,可以通过使用goroutine和channel来实现并发操作。然而,在并发编程中,死锁是一个常见的问题。当goroutine之间相互依赖于彼此的资源,并且在访问这些资源时产生了循环依...
    99+
    2023-10-22
    解决方案 Go语言 死锁
  • Go语言死锁与goroutine泄露问题的解决
    目录什么时候会导致死锁 发送单个值时的死锁 多个值发送的死锁 解决多值发送死锁 应该先发送还是先接收 goroutine 泄漏 如何发现泄露 小结 什么时候会导致死锁 在计算机组成...
    99+
    2022-11-12
  • mysqlkillprocess解决死锁问题
    目录mysql kill process解决死锁mysql死锁异常分析及解决问题产生原因分析解决方案mysql kill process解决死锁 1、查看进程列表, 找到ID sho...
    99+
    2022-11-13
  • 在python中解决死锁的问题
    1.添加超时时间: fromthreading import Thread, Lock importtime mutex1= Lock() # 创建一个互斥锁 mutex2=...
    99+
    2022-11-12
  • C语言多线程开发中死锁与读写锁问题怎么解决
    今天小编给大家分享一下C语言多线程开发中死锁与读写锁问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。死锁有时,一个...
    99+
    2023-06-30
  • 如何解决java中的死锁问题
    一、死锁的定义死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。那么我们换一个更加规范的定义:集合中的每一个进程都在等待只能由本集合中的其他进程才能引发的事件,...
    99+
    2016-01-19
    java教程 java 死锁
  • 详解go语言中并发安全和锁问题
    首先可以先看看这篇文章,对锁有些了解 GO语言并发编程之互斥锁、读写锁详解 Mutex-互斥锁 Mutex 的实现主要借助了 CAS 指令 + 自旋 + 信号量 数据结构: ty...
    99+
    2022-11-12
  • C语言多线程开发中死锁与读写锁问题详解
    目录死锁读写锁死锁 有时,一个线程需要同时访问两个或更多不同的共享资源,而每个资源又都由不同的互斥量管理。当超过一个线程加锁同一组互斥量时,就有可能发生死锁; 两个或两个以上的进程在...
    99+
    2022-11-13
  • mysql kill process解决死锁问题
    目录mysql kill process解决死锁mysql死锁异常分析及解决问题产生原因分析解决方案mysql kill process解决死锁 1、查看进程列表, 找到ID show processlist; +--...
    99+
    2022-08-24
  • sql死锁问题怎么解决
    本篇内容介绍了“sql死锁问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! --查询锁表信息,...
    99+
    2022-10-18
  • 怎样解决Mysql死锁问题
    怎样解决Mysql死锁问题,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 show engine in...
    99+
    2022-10-18
  • Mysql如何解决死锁问题
    这篇文章主要为大家展示了“Mysql如何解决死锁问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Mysql如何解决死锁问题”这篇文章吧。 ...
    99+
    2022-10-19
  • 如何解决MySQL死锁问题
    这篇文章主要介绍“如何解决MySQL死锁问题”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何解决MySQL死锁问题”文章能帮助大家解决问题。1、什么是死锁死锁是并...
    99+
    2022-10-19
  • Java死锁问题怎么解决
    今天小编给大家分享一下Java死锁问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。前言:死锁(Dead Lock)...
    99+
    2023-06-30
  • 在python中如何解决死锁的问题
    这篇文章将为大家详细讲解有关在python中如何解决死锁的问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.添加超时时间:fromthreading import Thread,&...
    99+
    2023-06-14
  • 如何解决Go语言中的并发文件的读写锁冲突问题?
    如何解决Go语言中的并发文件的读写锁冲突问题?在Go语言中,我们经常会遇到需要同时对一个文件进行读写操作的场景,比如并发地写日志文件。如果不加以控制,多个goroutine同时对同一个文件进行读写操作,就会产生冲突,导致数据丢失或不一致。为...
    99+
    2023-10-22
    并发 关键词:Go语言 文件读写锁冲突
  • Process的waitFor死锁问题如何解决
    本篇内容主要讲解“Process的waitFor死锁问题如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Process的waitFor死锁问题如何解决”吧!Process的waitFor死...
    99+
    2023-06-22
  • 如何解决Task.Result就死锁的问题
    如何解决Task.Result就死锁的问题,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、背景1. 讲故事前些天把 .NET...
    99+
    2022-10-19
  • 【mysql】mysql死锁问题解决方案
    mysql死锁问题解决方案 查询出是被哪个进程给锁住了为什么会产生死锁日志内容:日志解析:找到问题: 解决方案 查询出是被哪个进程给锁住了 执行sql: select ...
    99+
    2023-09-23
    mysql adb 数据库
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作