在java中使用synchronize关键字和锁去实现资源的并发访问控制,这是为了保证共享数据的安全。但是另外,当一个资源有多个副本可用的时候像公共设施一样,这种就方式就不适用了,因为这个资源可以同时被一定数量的线程使用,而不仅仅是拿到锁的哪一个线程。
Seamaphore(se mer for)类是一个计数信号量,必须由获取它的线程去释放。通常用于限制可以访问某些资源的线程数目,可以为它设置一个阀值,线程达到阀值时就会被阻塞。
通过 自身的构造方法可以得到该对象,只用将初始化可用的许可数目传进构造方法即可。
线程可以通过acquire(a 安静)方法获得信号量许可(),通过release()去释放一个许可。
底层原理是Semaphore内部维护了一个计数器,其值为可以访问的共享资源的个数。如果信号量的计数器大于1是意味着有共享资源可以访问,如果计数器值为0的时候线程进入休眠,等待其他线程执行完释放信号量。
可以用来控制数据库的流量和某些资源的并发访问流量
它有非公平性,因为当一个线程在执行获取许可的方法时可以直接去尝试去获取许可,不管是不是之前有线程拿不到许可而进行阻塞了很久,当有新的资源被释放出来的时候他们两个必须去共同竞争。 等待
这个问题可以通过阻塞队列去解决,就是队列嘛,如何前面没有等待的线程就可以直接获取许可,如果前面有被阻塞的线程就挂到阻塞队列的最后
Seamaphore(se mer for)类是一个计数信号量,必须由获取它的线程去释放。通常用于限制可以访问某些资源的线程数目,可以为它设置一个阀值,线程达到阀值时就会被阻塞。
通过 自身的构造方法可以得到该对象,只用将初始化可用的许可数目传进构造方法即可。
线程可以通过acquire(a 安静)方法获得信号量许可(),通过release()去释放一个许可。
底层原理是Semaphore内部维护了一个计数器,其值为可以访问的共享资源的个数。如果信号量的计数器大于1是意味着有共享资源可以访问,如果计数器值为0的时候线程进入休眠,等待其他线程执行完释放信号量。
可以用来控制数据库的流量和某些资源的并发访问流量
它有非公平性,因为当一个线程在执行获取许可的方法时可以直接去尝试去获取许可,不管是不是之前有线程拿不到许可而进行阻塞了很久,当有新的资源被释放出来的时候他们两个必须去共同竞争。 等待
这个问题可以通过阻塞队列去解决,就是队列嘛,如何前面没有等待的线程就可以直接获取许可,如果前面有被阻塞的线程就挂到阻塞队列的最后