public class Singleton{
private Singleton(){};
private Map map = new HashMap();//非静态的成员变量
private static Singleton single = new Singleton();
public static Singleton getSingleton(){
return single;
}
}
private Singleton(){};
private Map map = new HashMap();//非静态的成员变量
private static Singleton single = new Singleton();
public static Singleton getSingleton(){
return single;
}
}
解决方案 »
- Eclipse: class file editor: source not found
- 关于服务器租借和托管
- android 线程池能实现每个线程执行完之后就在主线程显示吗
- 初学者迷茫在JAVA路途中
- 散分~顺便 贴个题目出来 考考大家~~~
- private,public权限问题!
- BufferedReader用完以后,为什么要用flush()
- 【很重要的 都来说说】 myInterface myObj = new myImplClass() ???
- 谁有JAVA版的烟花代码程序??
- 什么叫网页的生命周期?
- URLEncodedUtils.parse()处理中文有错误?
- 求高手点拨一个CS结构聊天界面的UI代码实现问题所在....
根本不存在同时修改MAP的情况。
public static Singleton getInstance() {
if (single == null) {
single = new Singleton();
}
return single ;
}
这里当并发访问的时候,当第一个线程过来发现single为null,这时进入if中准备new(还未new完成),此时另外一个线程也过来了,发现single依然为空,然后也进if中new了一个,这样就有new了2个single实例,也就不符合单例设计模式了,所以- -
这篇文章已经能解决你的问题了如果public确实存在安全问题而且文章上说单例模式这样写也容易出现问题。具
* 单例模式:ThreadLocal实现
*/
public class Singletion4 {
//每个ThreadLocal与当前线程绑定,用其注册当前对象
private static ThreadLocal<Singletion4> tl = new ThreadLocal<Singletion4>();
private Singletion4(){};
public static Singletion4 getInstance(){
if(tl.get()==null){ //如果为空创建对象并放入ThreadLocal
tl.set(new Singletion4());
}
return tl.get();
}
}
单例模式就是保证在内存中只存在一个该类型的实例对象,不管是饿汉式,懒汉式,都要保证这一点。大家都理解的很好。
楼主的问题是 “我考虑的是如果是多个线程同时修改map那么就会造成一个线程读取到另一个线程修改后的map ” 考虑的是多个线程操作这个实例变量时,会对其属性造成安全问题。
单例模式虽然保证在内存中之存在一个该类型的实例对象。但如果要对其实现线程安全,在对map修改时,还是要加同步的,也就是线程安全问题还是存在的