zoukankan      html  css  js  c++  java
  • java实现PV操作

    package com.jayfulmath.designpattern.command;
    
    import java.util.concurrent.Semaphore;
    
    /*
        P(S):
        
        ①将信号量S的值减1,即S=S-1;
        
        ②如果S>=0,则该进程继续执行;否则该进程置为等待状态。
        
        V(S):
        
        ①将信号量S的值加1,即S=S+1;
        
        ②该进程继续执行;如果该信号的等待队列中有等待进程就唤醒一等待进程。
     * 
     * */
    public class PVObject {
        
        private Semaphore mSemaphore =null;
        private int Max_size = 0xff;
        private String name = null;
        public PVObject(int size,String name)
        {
            if(size>0)
            {
                Max_size = size;
                mSemaphore = new Semaphore(size);
            }
            this.name = name;
        }
        
        public PVObject(String name)
        {
            Max_size = 1;
            mSemaphore = new Semaphore(1);
            this.name = name;
        }
        
        public void Init(int status)
        {
            if(status<0 || status>Max_size)
            {
                System.out.println("[PVObject][Init]"+name+" wrong,status:"+status);
                return;
            }
            
            if(status == Max_size)
            {
                return;
            }
            
            try {
                mSemaphore.release(Max_size);
                mSemaphore.acquire(Max_size-status);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }    
        }
        
        public void P()
        {
            try {
                //
                mSemaphore.acquire();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }        
        }
        
        public void V()
        {
            mSemaphore.release();        
        }
    }
    Max_size 为允许同时使用信号量的个数,默认情况是1个。
  • 相关阅读:
    leetcode Ch2-Dynamic Programming I
    leetcode Ch3-DFS & Backtracking II
    关于尾递归
    leetcode BFS
    linux各文件夹的作用
    auto_ptr与shared_ptr ZZ
    漏洞分析中常用的堆调试支持
    【读书笔记】Android平台的漏洞挖掘和分析
    关于Fuzz——peach的学习
    如何验证一个地址可否使用—— MmIsAddressValid函数分析
  • 原文地址:https://www.cnblogs.com/deman/p/4184634.html
Copyright © 2011-2022 走看看