Semaphore类的主要作用是限制线程并发的数量,如果不限制线程并发的数量,CPU的资源将会面临耗尽的局面,每个线程执行任务将会相当缓慢。因为CPU要将时间片分配给不同的线程对象,而且上下文切换也要耗时,最终导致系统运行效率大幅降低。
1.1 类Semaphore构造方法
方法:Semaphore(int permits)
作用:新建一个Semaphore对象。
参数:permits,作用是初始化设置许可的数量。即最多允许permits个线程执行acquire()与release()之间的代码。当permits大于1时,则该类并不能保证线程的安全性,因为还是有可能会导致多个线程共同访问实例变量,导致出现脏数据的情况。
方法:Semaphore(int permits, boolean fair)
参数:fair,表明创建的Semaphore对象是公平信号量(fair为true)还是非公平信号量(fair为false)。所谓公平信号量表明获得锁的顺序与线程启动的顺序相关,但不代表100%的获得信号量,仅仅是在概率上能够获得保证。而非公平信号量就是无关的了。
1.2 方法acquire(int permits)参数作用及动态添加许可
方法:acquire(int permits)
作用:每次调用一次该方法,则消耗permits个许可。
方法:acquire()
作用:每次调用一次该方法,则消耗一个许可。
方法:release()
作用:每次调用一次该方法,相当于许可加1。
方法:release(int permits)
作用:每次调用一次该方法,相当于加上permits个许可。
release()与release(int permits),当多次调用时,相当于动态增加许可总个数。在实际开发中,acquire()与release()成对出现,以保证每个线程用时消耗,用完释放。最后实现限制线程最大并发数。
1.3 acquireUninterruptibly()
方法:acquireUninterruptibly()
作用:使得等待进入acquile()方法的线程,不允许被中断。
方法:acquireUninterruptibly(int permits)
作用:此方法的作用是,等待许可的条件下不允许中断,且获得锁后,将消耗permits个许可。
1.4 availablePermits()和drainPermits()
方法:availablePermits()
作用:返回此Semaphore对象当前可用的许可数,此方法通常用于调试,因为许可的数量有可能实时在改变,并不是固定的数量。
方法:drainPermits()
作用:返回此Semaphore对象当前可用的许可数,并将可用许可清零。
1.5 getQueueLength()和hasQueuedThread()
方法:getQueueLength()
作用:取得此Semaphore对象等待许可的线程个数。
方法:hasQueuedThread()
作用:判断此Semaphore对象是否还有等待许可的线程。
1.6 方法:tryAcquire()
作用:无参方法tryAcquire()作用是尝试获取一个许可,如果获取不到返回false,通常与if语句结合,其具有无阻塞特点。无阻塞特点是,不至于将线程在同步处一直等待状态,如果if判断不成立,则线程会继续走else语句,程序会继续向下运行。
方法:tryAcquire(int permits)
左右:尝试获取permits个许可,如果获取不到则返回false。
方法:tryAcquire(long timeOut, TimerUnit unit)
作用:在指定的时间内尝试获取一个许可,如果获取不到返回false。
方法:tryAcquire(int permits, long timeOut, TimerUnit unit)
作用:在指定的时间内尝试获取permits个许可,如果获取不到返回false。