欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

synchronized关键字实现信号量同步功能

程序员文章站 2022-07-13 16:43:53
...
下面的代码,不加mys.acquire();和mys.release();的时候,各线程会交替输出。
加上的话,各线程会串行输出,说明信号量机制生效了。

MySemaphore.java

interface Semaphore { 
  void acquire();
  void release();
} 

public class MySemaphore implements Semaphore{
	private StringBuffer runFlag = new StringBuffer("true");

  public void acquire(){
  	synchronized(runFlag){
      if(runFlag.toString().equals("true")){
      	runFlag.setLength(0);
      	runFlag.append("false");
      }else{
        try{
            runFlag.wait();
        	runFlag.setLength(0);
      	    runFlag.append("false");
        }catch(Exception e){
      	  e.printStackTrace();
        }
      }
    }
  }

  public void release(){
  	synchronized(runFlag){
        runFlag.setLength(0);
      	runFlag.append("true");
      	try{
      	  runFlag.notify();
      	}catch(Exception e){
      		e.printStackTrace();
      	}
    }
  }

	public static void main(String[] args){
		
		
		Runnable run = new Runnable(){
			    MySemaphore mys = new MySemaphore();
			
				public void run(){
					mys.acquire();
					System.out.println(Thread.currentThread().getName() + " start");
					for(int j=0;j<10;j++){
					  System.out.println(Thread.currentThread().getName() + " start " + j);
					}
					System.out.println(Thread.currentThread().getName() + " end");
					mys.release();
				}
		};
		
		Thread t;
		for(int i=0;i<10;i++){
		  t = new Thread(run);
		  t.start();
		}
	}
}