public TairClient get(final String targetUrl, final int connectionTimeout, final PacketStreamer pstreamer)
			throws TairClientException {
		String key = targetUrl;
		FutureTask<TairClient> existTask = null;
		existTask = clients.get(key);
 
		if (existTask == null) {
			FutureTask<TairClient> task = new FutureTask<TairClient>(
					new Callable<TairClient>() {
						public TairClient call() throws Exception {
							return createClient(targetUrl, connectionTimeout,
									pstreamer);
						}
					});
			existTask = clients.putIfAbsent(key, task);
			if (existTask == null) {
				existTask = task;
				task.run();
			}
		}
		
		try {
			return existTask.get();
		} catch (InterruptedException e) {
			throw new RuntimeException(e);
		} catch (CancellationException e) {
			// cancel exception may be lost connection fd, but we never called task.cancel();
			clients.remove(key);
			throw e;
		} catch (ExecutionException e) {
			// create socket failed, so need not close
			clients.remove(key);
			throw new TairClientException(
					"create socket exception, target address is "+ targetUrl, e);
		}
	}