Semaphore信号量的总结

在java中使用synchronize关键字和锁去实现资源的并发访问控制,这是为了保证共享数据的安全。但是另外,当一个资源有多个副本可用的时候像公共设施一样,这种就方式就不适用了,因为这个资源可以同时被一定数量的线程使用,而不仅仅是拿到锁的哪一个线程。

Seamaphore(se mer for)类是一个计数信号量,必须由获取它的线程去释放。通常用于限制可以访问某些资源的线程数目,可以为它设置一个阀值,线程达到阀值时就会被阻塞。

通过 自身的构造方法可以得到该对象,只用将初始化可用的许可数目传进构造方法即可。

线程可以通过acquire(a 安静)方法获得信号量许可(),通过release()去释放一个许可。

底层原理是Semaphore内部维护了一个计数器,其值为可以访问的共享资源的个数。如果信号量的计数器大于1是意味着有共享资源可以访问,如果计数器值为0的时候线程进入休眠,等待其他线程执行完释放信号量。

可以用来控制数据库的流量和某些资源的并发访问流量

它有非公平性,因为当一个线程在执行获取许可的方法时可以直接去尝试去获取许可,不管是不是之前有线程拿不到许可而进行阻塞了很久,当有新的资源被释放出来的时候他们两个必须去共同竞争。 等待

这个问题可以通过阻塞队列去解决,就是队列嘛,如何前面没有等待的线程就可以直接获取许可,如果前面有被阻塞的线程就挂到阻塞队列的最后


在Windows系统中,信号量Semaphore)是一种同步对象,用于在多个线程之间协调共享资源的访问。Windows提供了一组API函数来创建、操作和销毁信号量。 以下是一些与信号量相关的API函数: 1. CreateSemaphore:创建一个信号量对象。 2. WaitForSingleObject:等待一个信号量对象。 3. ReleaseSemaphore:释放一个信号量对象。 4. OpenSemaphore:打开一个已经存在的信号量对象。 5. CloseHandle:关闭一个信号量对象的句柄。 下面是一个使用信号量的示例: ```C++ #include <windows.h> #include <iostream> using namespace std; HANDLE hSemaphore; // 信号量句柄 DWORD WINAPI ThreadProc(LPVOID lpParam) { // 等待信号量 WaitForSingleObject(hSemaphore, INFINITE); // 访问共享资源 cout << "Thread " << GetCurrentThreadId() << " access shared resource." << endl; // 释放信号量 ReleaseSemaphore(hSemaphore, 1, NULL); return 0; } int main() { // 创建信号量 hSemaphore = CreateSemaphore(NULL, 1, 1, NULL); // 创建线程 HANDLE hThread1 = CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL); HANDLE hThread2 = CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL); // 等待线程结束 WaitForSingleObject(hThread1, INFINITE); WaitForSingleObject(hThread2, INFINITE); // 关闭信号量句柄 CloseHandle(hSemaphore); return 0; } ``` 在这个示例中,我们创建了一个信号量句柄,并创建了两个线程。线程会等待信号量,然后访问共享资源。访问完成后,线程会释放信号量。由于信号量的初始计数为1,所以只有一个线程能够访问共享资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值