java阻塞中的信号量

时间:2018-04-12 18:08:52

标签: java multithreading semaphore

public class Watek implements Runnable {
  Semaphore sem = new Semaphore(1);
  int index = 0;
  int zakres = 0;
  Counter sum;
  private LinkedList < Integer > tablica;
  public Watek(int pivot_index, int chunk, Counter Atomic_var, LinkedList < Integer > tab) {
    index = pivot_index;
    zakres = chunk;
    sum = Atomic_var;
    tablica = tab;
  }


  @Override
  public void run() {
    try {
      int zm = 0;
      for (int j = index; j < zakres; j++) {
        zm += tablica.get(j);
      }

      sem.acquire();

      sum.add(zm);
      sem.release();
    } catch (InterruptedException ex) {
      Logger.getLogger(Watek.class.getName()).log(Level.SEVERE, null, ex);
    }

  }
}

我有点不确定我是否将二进制信号量放在正确的位置,因为我正在使用100个线程增加1维矩阵的值,当我使用信号量时,有时结果会像矩阵一样错误[100000我有时会得到100000有时98000,但是当我检查低线程数量时,如果更高的风险也更高,那么当你检查少量的线程时,这是信号量的错误或某处有错误吗?

1 个答案:

答案 0 :(得分:3)

您不应在runnable中创建信号量实例。在这种情况下,runnable的每个实例都有自己独特的信号量,因此您没有像预期的那样阻塞。

相反,在runnable外部创建信号量,并将其传递给runnable对象(例如通过构造函数),因此runnable的每个实例都使用相同的信号量。