Избегайте синхронизированного блока для логического отражения - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть этот метод:

  public void lock(Asyncc.IAsyncCallback<Unlock, Object> cb) {

    synchronized (this) {
      if (this.locked) {
        this.queue.add(cb);
        return;
      }

      this.locked = true;
    }

    cb.done(null, this.makeUnlock(true));

  }

Есть ли какой-то трюк, который я могу использовать, чтобы избежать вызова synchronized ()?

Я считаю, что присвоение логического значения является атомарным, поэтому только один потокмогу сделать это одновременно.

Идея в том, что мы хотим избежать блокировки двух потоков.Мы также не хотим, чтобы два разных кодовых пути захватывали блокировку, даже если они находятся в одном потоке.

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Возможно, можно избежать синхронизированного блока, используя AtomicBoolean вместо логического

0 голосов
/ 14 февраля 2019

Один из способов ускорить его на йоту - сделать что-то вроде:

  public void lock(Asyncc.IAsyncCallback<Unlock, Object> cb) {

    boolean add = false;
    synchronized (this) {
      if (this.locked) {
        add = true;
      }
      else {
        this.locked = true;
      }
    }

    if(add){
      this.queue.add(cb);
      return;
    }

    cb.done(null, this.makeUnlock(true));

  }

, но я до сих пор не знаю, есть ли способ избежать синхронизированного блока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...