风筝的北漂 2012-11-20 11:17
浏览 206
已采纳

一道synchronized笔试题,求指点。。。

有这样一道笔试题:

使用synchronized关键字实现Semaphore接口,实现信号量同步功能。
public interface Semaphore {
void acquire(); //获取一个信号量
void release(); //释放一个信号量
}

想了许久,不知该从哪下手,似乎不是简单的定义一个类实现这个接口,重写这两个方法,加上synchronized关键字,求指点,最好有详细的代码说明,不胜感激。

  • 写回答

2条回答 默认 最新

  • blogzhoubo 2012-11-20 14:35
    关注

    需要同步的代码前面加上:mys.acquire();
    后面加上:mys.release();即可。

    代码如下,已经通过测试:
    不加mys.acquire();和mys.release();的时候,各线程会交替输出。
    加上的话,各线程会串行输出,对比执行一下就明白了。

    MySemaphore.java

    [code="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();
        }
    }
    

    }[/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器