网站首页 > 技术文章 正文
列举常用的锁
- SemaphoreSlim:轻量级的信号量,用于控制同时访问资源的线程数量。
- ManualResetEventSlim:手动重置事件,用于线程间的信号通知和同步。
- ReaderWriterLockSlim:读写锁,允许多个线程同时读取共享资源,但只允许一个线程写入资源;通过EnterReadLock和EnterWriteLock方法获取读锁和写锁,通过ExitReadLock和ExitWriteLock方法释放锁。
- Mutex:互斥锁,用于控制对共享资源的访问,确保只有一个线程可以访问资源。
- AutoResetEvent:自动重置事件,用于线程间的信号通知和同步。
lock是一种什么样的锁?
lock是一个混合锁,lock关键字提供了一种简单的方式来实现对对象的互斥访问,其实质是Monitor,lock关键字会自动获取对象的锁,并在作用域结束时释放,确保临界区代码的互斥执行。
using System;
using System.Threading;
class Program
{private static object lockObject = new object(); // 定义一个对象作为锁
static void Main(){
for (int i = 1; i <= 5; i++)
{
Thread thread = new Thread(() => AccessSharedResource(i));
thread.Start();}
}
static void AccessSharedResource(int threadId)
{
lock (lockObject) // 使用lock关键字获取对象的锁
{
Console.WriteLine(#34;Thread {threadId} is accessing the shared resource.");
Thread.Sleep(1000); // 模拟处理资源的时间
Console.WriteLine(#34;Thread {threadId} released the shared resource.");
}
}
}
什么是死锁?
死锁:
当多个线程同时持有一些资源,并且每个线程都在等待其他线程释放资源时,就可能发生死锁。最终导致程序无法继续执行,严重影响程序的性能和稳定。
死锁常见的情形:
- 互斥等待:多线程同时持有某些资源,并且每个线程在等待其他线程释放资源时形成循环等待。
- 资源竞争:多线程竞争有限的资源,当资源分配不当时可能会导致死锁
- 嵌套锁:线程已经持有一个锁的同时尝试获取另外一个锁,可能导致死锁。
避免死锁的措施:
- 使用超时机制:在获取锁时设置超时时间,避免长时间的等待造成死锁。
- 按顺序获取锁:确保线程获取锁的顺序是一致的,避免循环等待。
- 避免嵌套锁:尽量避免在持有一个锁的情况下尝试获取另外一个锁。
- 避免资源竞争:合理设计资源的分配和释放策略,避免资源争夺导致死锁。
猜你喜欢
- 2024-10-12 漫画 | Linux 并发和竞态问题究竟是什么?
- 2024-10-12 【驱动】串口驱动分析(三)-serial driver
- 2024-10-12 synchronized锁 synchronized锁的是类还是对象
- 2024-10-12 Golang 程序遇到性能问题该怎么办?
- 2024-10-12 线程间通信——互斥锁 线程间互斥方式
- 2024-10-12 【Linux系统编程】互斥锁 linux 互斥锁优先级反转
- 2024-10-12 linux c/c++开发:多线程并发锁:互斥锁、自旋锁、原子操作、CAS
- 2024-10-12 每行代码都带注释,带你看懂Go互斥锁的源码
- 2024-10-12 一文搞懂pprof 一文搞懂伤寒论六经辨证
- 2024-10-12 并发原理系列八:信号量、互斥锁、自旋锁
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)