хранить данные в классах Singleton - PullRequest
2 голосов
/ 19 мая 2011

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

Данные, которые должны быть разделены между потоками: (Широта, Долгота).

И вот моя проблема: что я должен использовать для хранения этих данных в классе Singleton?

Некоторые списки ..?

И если вы также можете привести пример, это было бы здорово. Спасибо!

Является ли этот синглтон ????

EDIT:

У меня есть Java-приложение, которое выполняет следующие действия:

1.Первый поток (который является ThreadPool), который, я полагаю, также напишет в BlockingQ Прослушивает один порт для входящих соединений от пяти разных пользователей Давайте назовем их:

user1 user2 user3 user4 USER5

каждый из них отправляет данные GPS.

2. Второй поток - который будет читать из BlockingQ. В то же время мое java-приложение прослушивает второй порт, где ожидает подключения другого клиента (отличного от тех, кто отправляет данные GPS).

Теперь ... У меня есть второе приложение, которое подключается к Java-приложению, которое я только что описал.

Во втором приложении у меня есть список user1 ... user5 и определение того, какой элемент я выберу (user1 ... 5). Я должен получить оттуда правильные данные.

Так что теперь .... как мне записать / прочитать данные в BlockingQ, чтобы я мог получить правильные данные ???

Ответы [ 4 ]

4 голосов
/ 19 мая 2011

Я думаю, что вы пытаетесь достичь, это шаблон потребительского образца. Для этого вы должны использовать BlockingQueue и неизменный Coordinate объект с широтой и долготой.

Coordinate должно иметь только два поля Долгота и Широта, которые оба являются полями final и могут быть установлены только с помощью конструктора. Таким образом, вы можете убедиться, что у вас нет условий гонки или случайно поменять поля с неправильной нитью.

BlockingQueue не хранит данные постоянно, поэтому только , если вам нужно сделать это, вы могли бы создать синглтон.
Лучшее решение - создать класс, подобный ShareData, и просто передать их двум потокам, чтобы вы могли сэкономить время, создавая потокобезопасный Singleton. Это может выглядеть так:

public interface ShareData {
    public void AddToList(Coordinate coord); // add to BlockingQueue and an internal store here
    public Coordinate TakeFromList();  // take from BlockingQueue
}

Класс Coordinate должен выглядеть следующим образом и является потокобезопасным, поскольку он неизменен и не может изменять свое значение.

public class Coordinate {
  private final double lon;
  private final double lat;

  public Coordinate(double lon, double lat) {
    this.lon = lon;
    this.lat = lat;
  }

  public double getLon() {
    return lon;
  }

  public double getLat() {
    return lat;
  }
}
2 голосов
/ 19 мая 2011

Мой совет - не беспокоиться о синглтоне. Синглтоны почти никогда не являются хорошей идеей. Если вы не хотите больше одного из них, просто не делайте больше одного из них.Если вы хотите, чтобы он был глобальным, объявите свой единственный объект класса global (но еще лучше, просто выберите класс для его владения.).

Я не знаю вашу программу, но я бы выложился неплохоСкорее всего, вы никогда не увидите ошибку, вызванную тем, что кто-то случайно создал более одного из ваших общих объектов класса данных.Тем не менее, правильное создание потоково-безопасных синглетов - очень сложная проблема, и у вас, скорее всего, будут ошибки, если вы попытаетесь это сделать.

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

0 голосов
/ 19 мая 2011

Я бы посоветовал параллельную очередь

. Найдите в java.util.concurrent несколько реализаций, которые могут вам помочь: ConcurrentLinkedQueue, ConcurrentBlockingQueue

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

0 голосов
/ 19 мая 2011

Просто создайте класс для хранения этой информации. широта / долгота может быть представлена ​​двойными числами.

public class OuterClass {
    public static synchronized InnerSingleton getSingleton() {
        if(singleton == null) {
            singleton = new InnerSingleton();
        }
        return singleton;
    }

    private InnerSingleton singleton;

    class InnerSingleton {
        private double lat, lon;
        private InnerSingleton() { }
        public double getLatitude() { return lat; }
        public double getLongitude() { return lon; }
        public void setLatitude(double l) { lat = l; } //maybe validate? -90 <= lat <= 90
        public void setLongitude(double l) { lon = l; } //maybe validate? -180 <= lon <= 180
   }

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