深圳地区网站建设,公众号怎么制作二维码,整合营销策略,dedecms制作网站教程实际中遇到了这样一个问题#xff1a; The producer group[xxxx] has been created before, specify another instanceName (like producer.setInstanceName) please. 发生的原因是#xff1a;一个进程内#xff0c;创建了多个相同topic的producer。 所以问题就转换成了如何…实际中遇到了这样一个问题 The producer group[xxxx] has been created before, specify another instanceName (like producer.setInstanceName) please. 发生的原因是一个进程内创建了多个相同topic的producer。 所以问题就转换成了如何避免进程内多个实例的创建。还有一个解决办法就是producer.setInstanceNameUUID.getUUID() 解决问题就要用到了单例模式。 单例模式可以参考synchronized能不能保证有序性单例模式下的懒汉和双检锁的思考 分析 为啥不用分布式锁呢分布式其实保证集群内唯一就是不管你有多少台机器全局就一个唯一的一个。 分布式环境其实就是不同的进程间的问题。集群内唯一实质就是进程间唯一 “进程唯一”指的是进程内唯一、进程间不唯一。“线程唯一”指的是线程内唯一、线程间不唯一。集群相当于多个进程构成的一个集合“集群唯一”就相当于是进程内唯一、进程间也唯一。也就是说不同的进程间共享同一个对象不能创建同一个类的多个对象。 我们知道经典的单例模式是进程内唯一的那如何实现一个进程间也唯一的单例呢如果严格按照不同的进程间共享同一个对象来实现那集群唯一的单例实现起来就有点难度了。 具体来说我们需要把这个单例对象序列化并存储到外部共享存储区比如文件。进程在使用这个单例对象的时候需要先从外部共享存储区中将它读取到内存并反序列化成对象然后再使用使用完成之后还需要再存储回外部共享存储区。 为了保证任何时刻在进程间都只有一份对象存在一个进程在获取到对象之后需要对对象加锁避免其他进程再将其获取。在进程使用完这个对象之后还需要显式地将对象从内存中删除并且释放对对象的加锁。 1.如何理解单例模式的唯一性
单例类中对象的唯一性的作用范围是“进程唯一”的。“进程唯一”指的是进程内唯一进程间不唯一“线程唯一”指的是线程内唯一线程间可以不唯一。实际上“进程唯一”就意味着线程内、线程间都唯一这也是“进程唯一”和“线程唯一”的区别之处。“集群唯一”指的是进程内唯一、进程间也唯一。
2.如何实现线程唯一的单例
我们通过一个HashMap来存储对象其中key是线程IDvalue是对象。这样我们就可以做到不同的线程对应不同的对象同一个线程只能对应一个对象。实际上Java语言本身提供了ThreadLocal并发工具类可以更加轻松地实现线程唯一单例。
3.如何实现集群环境下的单例
我们需要把这个单例对象序列化并存储到外部共享存储区比如文件。进程在使用这个单例对象的时候需要先从外部共享存储区中将它读取到内存并反序列化成对象然后再使用使用完成之后还需要再存储回外部共享存储区。为了保证任何时刻在进程间都只有一份对象存在一个进程在获取到对象之后需要对对象加锁避免其他进程再将其获取。在进程使用完这个对象之后需要显式地将对象从内存中删除并且释放对对象的加锁。
4.如何实现一个多例模式
“单例”指的是一个类只能创建一个对象。对应地“多例”指的就是一个类可以创建多个对象但是个数是有限制的比如只能创建3个对象。多例的实现也比较简单通过一个Map来存储对象类型和对象之间的对应关系来控制对象的个数。
参考 1.https://blog.51cto.com/u_15273875/2917903 2.王铮《设计模式之美》