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;
}
}
解决方案 »
- swing 中的jTextArea 能不能加监听事件?
- JFrame 菜单有关的问题
- 大家好啊..问个小白问题...对象序列化怎么去理解喔...通俗点告诉我谢谢哈
- 关于java 时间加数字的问题~~~
- 在JSP中,向数据库插入记录,values后用具体的值插入成功,用变量就不行,为什么呢?
- 关于端口问题
- 关于JBuilder8 运行单个文件
- 我用java。awt控件做的 applet在Ie5、ie6为什么不能运行?????
- Java中有无象delphi的 ShowMessage('OK')弹出模之类的语句(再如JavaScript的Alert())
- scjp一道!!!!!!!!!!!!!!!!
- 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修改时,还是要加同步的,也就是线程安全问题还是存在的