我正在尝试创建一个类,ThreadSafe Singleton
但不知何故我无法理解如何创建ThreadSafe Singleton
可以接受参数的类。
下面是我从这个 github链接中使用的类,我目前正在使用它来连接到 Zookeeper -
public class LeaderLatchExample {
private CuratorFramework client;
private String latchPath;
private String id;
private LeaderLatch leaderLatch;
public LeaderLatchExample(String connString, String latchPath, String id) {
client = CuratorFrameworkFactory.newClient(connString, new ExponentialBackoffRetry(1000, Integer.MAX_VALUE));
this.id = id;
this.latchPath = latchPath;
}
public void start() throws Exception {
client.start();
client.getZookeeperClient().blockUntilConnectedOrTimedOut();
leaderLatch = new LeaderLatch(client, latchPath, id);
leaderLatch.start();
}
public boolean isLeader() {
return leaderLatch.hasLeadership();
}
public Participant currentLeader() throws Exception {
return leaderLatch.getLeader();
}
public void close() throws IOException {
leaderLatch.close();
client.close();
}
public CuratorFramework getClient() {
return client;
}
public String getLatchPath() {
return latchPath;
}
public String getId() {
return id;
}
public LeaderLatch getLeaderLatch() {
return leaderLatch;
}
}
这就是我调用上述课程的方式 -
public static void main(String[] args) throws Exception {
String latchPath = "/latch";
String connStr = "10.12.136.235:2181";
LeaderLatchExample node1 = new LeaderLatchExample(connStr, latchPath, "node-1"); // this I will be doing only one time at just the initialization time
node1.start();
System.out.println("now node-1 think the leader is " + node1.currentLeader());
}
现在我需要的是,如果我从程序中的任何类调用以下这两个方法,我应该能够获得它的一个实例。所以我想把上面的类作为一个线程安全的单例,这样我就可以在我的所有java程序中访问这两种方法。
isLeader()
getClient()
我如何将上述类设为 ThreadSafe 单例,然后在我的所有类中使用isLeader()
并getClient()
查看谁是领导者并获取客户端实例。
我只需要在初始化时这样做,一旦完成,我应该能够在我的所有类中使用isLeader()
和使用getClient()
。这可能吗?
// this line I will be doing only one time at just the initialization time
LeaderLatchExample node1 = new LeaderLatchExample(connStr, latchPath, "node-1");
node1.start();
这更多的是 Java 问题而不是 Zookeeper 的东西..