gpt4 book ai didi

java - 使用监视器概念实现信号量

转载 作者:行者123 更新时间:2023-12-02 09:39:36 25 4
gpt4 key购买 nike

我正在尝试使用 Java 中的监视器概念来实现信号量。即实现弱计数信号量的 Java 类(使用 init、signal 和 wait 方法)

有人可以告诉我这个类是否正确(如果不正确是什么问题):

class MyMonitor
{
int counter = 0;

//init
public MyMonitor( int init )
{
counter = init;
}

//Signal
public synchronized void S()
{
counter++;
notify();
}

//Wait
public synchronized void W()
{
if( counter == 0 )
{
try
{
wait();
}
catch(InterruptedException e) { }
}

counter--;
}
}

如果这是正确的,有人可以告诉我如何测试该类(class)。

最佳答案

应该是这样的(使用while,而不是if):

class YourMonitor
{
int counter = 0;

//init
public MyMonitor( int init )
{
counter = init;
}

//Signal
public synchronized void S()
{
counter++;
notifyAll();
}

//Wait
public synchronized void W() throws InterruptedException
{
while ( counter <= 0 )
{
wait();
}

counter--;
}
}

如何测试:

public class TestYourSemaphore
{
private static final int CNT = 100000;

private int x = 0;
private YourSemaphore s = new YourSemaphore();

public void run() throws InterruptedException
{
Thread t1 = new Thread(new MyRunnable());
Thread t2 = new Thread(new MyRunnable());
Thread t2 = new Thread(new MyRunnable());

t1.start();
t2.start();
t3.start();

t1.join();
t2.join();
t3.join();


// Verify, that the X has correct value
if (x != 3 * CNT)
{
throw new RuntimeException("Race condition error!");
}
System.out.println("Finished");
}

private class MyRunnable implements Runnable
{
@Override
public void run()
{
for (int i = 0; i < CNT; i++)
{
//un-comment to use Semaphores
//s.enter();
x = x + 1;
//s.leave();
}
}
}
}
  • 如果没有信号量,异常就会一直(几乎)抛出。
  • 使用建议的信号量,不会引发异常。
  • 使用信号量时,有时会抛出异常(但不像没有信号量那样频繁)。

您的信号量的问题是:

  1. 线程 1 有锁
  2. 线程 2 和线程 3 正在 wait()ing
  3. 线程 1 调用 notifyAll()
  4. 线程2和3同时进入临界区,这很糟糕:)

关于java - 使用监视器概念实现信号量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9609310/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com