信号量Semaphore实现互斥锁Mutex

信号量Semaphore实现互斥锁Mutex,第1张

信号量Semaphore实现互斥锁Mutex,第2张

在Doug lea的《Java并发编程——设计原则和模式》一书中,英文名为“Concurrent Programming in Java & # 8482;:设计原则与模式,第二版”,书中提到互斥可以通过信号量Semaphore来实现。虽然锁是由java中的synchronize关键字提供的,但是信号量是由这个基础设施实现的。有些系统只有原语信号量,锁是通过信号量实现的。代码如下:

导入Java . util . concurrent . semaphore;

公共类互斥体...{
私有信号量s =新信号量(1);

public void acquire()引发InterruptedException...{
s . acquire();
}
公开作废发布()...{
s . release();
}
公共布尔尝试(int ms)引发InterruptedException...{
return s . try acquire(ms);
}
}

上面的代码只能在java5中编译,因为Semaphore只在java5中提供。我在阅读上面的代码时有疑问。如果误连续调用了两次release,然后两个线程都调用了acquire,那么两个线程不会同时运行,从而违反了互斥体的定义吗?为了证明我的猜测,我编写了以下代码:

公共类TestMutex...{
公共静态void main(String[] args)引发InterruptedException...{
互斥Mutex = new Mutex();
mutex . acquire();
mutex . release();
mutex . release();
新的MyThread(互斥)。start();
新的MyThread(互斥)。start();
}

}

类MyThread扩展线程...{
私有互斥体互斥体;

公共MyThread(互斥体互斥体)...{
this . mutex = mutex;
}

公共无效运行()...{
试试看...{
mutex . acquire();
} catch(中断异常e1)...{
抛出新的runtime exception(E1);
}
for(int I = 0;I system . out . print(I);
if(i%3==0)...{
试试看...{
thread . sleep(100);
} catch(中断异常e)...{
e . printstacktrace();
}
}
}
mutex . release();
}
}
这个程序的输出如下:
00123123456456789789
从而证实了我的猜测。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 信号量Semaphore实现互斥锁Mutex

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情