繁体   English   中英

将数据存储在Singleton类中

[英]store data in Singleton classes

我在Java中有一个使用两个不同线程的应用程序,为了在这两个线程之间共享数据,我想使用Singleton类。

需要在线程之间共享的数据是(纬度,经度)。

这是我的问题:在Singleton类中应使用什么存储这些数据?

一些列表..?

如果您还可以提供示例,那就太好了。谢谢!

这是Singleton吗????我怎样才能使其不成为Singleton?

编辑:

我有一个执行以下操作的Java应用程序:

1.第一个线程(它是一个ThreadPool)-我相信它也会写在BlockingQ中侦听一个端口,以接收来自五个不同用户的传入连接让我们称它们为:

用户1用户2用户3用户4用户5

他们每个人都发送GPS数据。

2.第二个线程,它将从BlockingQ中读取。 同时,我的Java应用程序侦听第二个端口,等待另一个客户端(与发送GPS数据的客户端不同)连接到该客户端。

现在...我有第二个应用程序,它连接到我刚刚描述的Java应用程序。

在第二个应用程序中,我有一个列表user1 ... user5,并确定要在哪个项目上选择(user1 ... 5),我必须从那里接收正确的数据。

所以现在....我如何在BlockingQ中写入/读取数据,以便接收正确的数据?

我认为您想要实现的是生产者消费者模式。 为此,您应该使用BlockingQueue和具有经度和纬度的不变Coordinate对象。

Coordinate应仅包含两个字段经度和纬度,它们都是final字段,并且只能使用构造函数进行设置。 这样,您可以确定自己没有任何竞争条件,也不会因线程错误而意外更改字段。

BlockingQueue不会永久存储数据,因此只有在需要时才 可以创建Singleton。
更好的解决方案是创建一个类似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;
  }
}

我的建议是不要打扰单身人士。 单例几乎从来都不是一个好主意。 如果您不想要超过一个,就不要超过一个。 如果要全局,则将您的类的一个对象声明为全局(但更好的是,选择一个类来拥有它)。

我不知道您的程序,但是我很可能不会看到由某人无意中制作了多个共享数据类对象而导致的错误。 但是,正确地编写线程安全的单例代码是一个非常棘手的问题,如果您尝试这样做,则很可能会出现错误。

然后,有一天您发现由于某种原因需要另一对通信线程,该怎么办? 您当然希望这些共享数据对象中的另一个与它们一起使用,但是由于您将它变成单例,因此成为该类的主要重写,而不是琐碎的事情。

只需创建一个类来存储该信息即可。 纬度/经度可以用双精度表示。

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
   }

}

我建议并发队列

java.util.concurrent中查找可以帮助您的几种实现:ConcurrentLinkedQueue,ConcurrentBlockingQueue

因此,您有一个单例队列,一个线程从中读取该线程,另一个线程向该线程写入

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM