Использование объекта Thread в качестве ключа в HashMap - PullRequest
0 голосов
/ 27 мая 2018

Я читал это: http://tutorials.jenkov.com/java-concurrency/read-write-locks.html

В этом уроке, для написания блокировки чтения для входящего пользователя, был использован следующий код

    public class ReadWriteLock{

      private Map<Thread, Integer> readingThreads =
          new HashMap<Thread, Integer>();

      private int writers        = 0;
      private int writeRequests  = 0;

      public synchronized void lockRead() throws InterruptedException{
        Thread callingThread = Thread.currentThread();
        while(! canGrantReadAccess(callingThread)){
          wait();                                                                   
        }

        readingThreads.put(callingThread,
           (getAccessCount(callingThread) + 1));
      }


      public synchronized void unlockRead(){
        Thread callingThread = Thread.currentThread();
        int accessCount = getAccessCount(callingThread);
        if(accessCount == 1){ readingThreads.remove(callingThread); }
        else { readingThreads.put(callingThread, (accessCount -1)); }
        notifyAll();
      }


      private boolean canGrantReadAccess(Thread callingThread){
        if(writers > 0)            return false;
        if(isReader(callingThread) return true;
        if(writeRequests > 0)      return false;
        return true;
      }

      private int getReadAccessCount(Thread callingThread){
        Integer accessCount = readingThreads.get(callingThread);
        if(accessCount == null) return 0;
        return accessCount.intValue();
      }

      private boolean isReader(Thread callingThread){
        return readingThreads.get(callingThread) != null;
      }

    }

Так что у меня есть вопрос, могу ли яиспользуйте hashmap, как это

  private Map<Thread, Integer> readingThreads =
      new HashMap<Thread, Integer>();

Я проверил код класса Thread, чтобы проверить, переопределяет ли он равенства и hashcode, и обнаружил, что это не так.Так будет ли это по умолчанию равно и хэш-код.Так что все будут указывать на одно и то же ведро ??

Может кто-нибудь, пожалуйста, помогите мне понять, как оно будет сопоставлено с ведрами.Кроме того, что нужно со стороны программиста, чтобы использовать объект потока в качестве ключа для hashmap?

1 Ответ

0 голосов
/ 27 мая 2018

То есть все будут указывать на одно и то же ведро?

Нет.В Java каждый класс (включая Thread) неявно расширяется от Object класса.Методы equals и hashCode, выходящие из класса Object, достаточны для того, чтобы объекты Thread распределялись по разным группам.

См. Документ Object.equals:

Метод equals для класса Object реализует максимально различающее отношение эквивалентности на объектах;то есть для любых ненулевых ссылочных значений x и y этот метод возвращает true тогда и только тогда, когда x и y ссылаются на один и тот же объект (x == y имеет значение true).

и Object.hashCode:

Насколько это целесообразно, метод hashCode, определенный классом Object, возвращает разные целые числа для разных объектов.

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