diff --git a/registry/zookeeper/listener.go b/registry/zookeeper/listener.go
index c25028d58f32f4028779fd6c050e60eef2bd7bd5..d81c7523c402184dc06692ecb42214ca666a61e3 100644
--- a/registry/zookeeper/listener.go
+++ b/registry/zookeeper/listener.go
@@ -74,11 +74,12 @@ type RegistryConfigurationListener struct {
 	client   *zk.ZookeeperClient
 	registry *zkRegistry
 	events   chan *config_center.ConfigChangeEvent
+	isClosed bool
 }
 
 func NewRegistryConfigurationListener(client *zk.ZookeeperClient, reg *zkRegistry) *RegistryConfigurationListener {
 	reg.wg.Add(1)
-	return &RegistryConfigurationListener{client: client, registry: reg, events: make(chan *config_center.ConfigChangeEvent, 32)}
+	return &RegistryConfigurationListener{client: client, registry: reg, events: make(chan *config_center.ConfigChangeEvent, 32), isClosed: false}
 }
 func (l *RegistryConfigurationListener) Process(configType *config_center.ConfigChangeEvent) {
 	l.events <- configType
@@ -114,6 +115,7 @@ func (l *RegistryConfigurationListener) Close() {
 		 * if the registry is not available, it means that the registry has been destroy
 		 * so we don't need to call Done(), or it will cause the negative count panic for registry.wg
 		 */
+		l.isClosed = true
 		l.registry.wg.Done()
 	}
 }
diff --git a/registry/zookeeper/registry.go b/registry/zookeeper/registry.go
index 13fb6c751f8010f1e716e37541aa8ac59256288c..137aa5423a3990f38d0632998ee49b66a25d8ecf 100644
--- a/registry/zookeeper/registry.go
+++ b/registry/zookeeper/registry.go
@@ -453,6 +453,10 @@ func (r *zkRegistry) getListener(conf *common.URL) (*RegistryConfigurationListen
 	)
 
 	r.listenerLock.Lock()
+	if r.configListener.isClosed {
+		return nil, perrors.New("configListener already been closed")
+		r.listenerLock.Unlock()
+	}
 	zkListener = r.configListener
 	r.listenerLock.Unlock()
 	if r.listener == nil {