请问单列模式 饿汉式 必须要加 final 修饰吗

thomaswen156 2009-12-19 04:57:03



public class EagerSingleton
{
private static final EagerSingleton m_instance =
new EagerSingleton();
private EagerSingleton() { }

public static EagerSingleton getInstance()
{

return m_instance;
}
}



请问这种饿汉式的单例 模式考虑到线程安全,需要 加 final 吗??不加也线程安全吗 ?为什么
...全文
283 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
tralone 2009-12-19
  • 打赏
  • 举报
回复
顶一楼,解释的很到位
gy19890220 2009-12-19
  • 打赏
  • 举报
回复
myjavaz 2009-12-19
  • 打赏
  • 举报
回复
必须加的
sotom 2009-12-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dinghun8leech 的回复:]
首先final关键词是代表此变量一经赋值,其指向的内存引用地址将不会再改变。
Java codepublicclass TestFinal {publicstaticfinal User user=new User("user one");publicstaticvoid main(String [] args) {
user.setName("user two");//final对象一经赋值,不可改变其在内存中的指向,但可以改变对象状态。 System.out.println(user.getName());
user=new User("user three");//这一步编译错误,最终变量不可再次赋值 }
}class User {private String name;public User(String name) {this.name= name;
}public String getName() {return name;
}publicvoid setName(String name) {this.name= name;
}
}
其次,线程安全和加不加final没有什么区别,打个经典的比方,两个人同时看到了桌上的一个蛋糕,于是两个人都坐下并拿起刀叉,但实际上有个人在叉向蛋糕的一瞬间,这个蛋糕被另一个人吃掉了,这就引起了错误,具体的例子还有很多。
解决线程安全的方法有好几个,比如楼主需要将所有操作此变量的方法加上排他锁,即方法声明时加上synchronized关键词(前提是这几个方法与这个需要保护的变量处在同一个类中)
[/Quote]


不错 呵呵 。 比我说的明白。
道光2008 2009-12-19
  • 打赏
  • 举报
回复
加,表示当前变量不可再修改
liuahuilele 2009-12-19
  • 打赏
  • 举报
回复
顶上
dinghun8leech 2009-12-19
  • 打赏
  • 举报
回复
首先final关键词是代表此变量一经赋值,其指向的内存引用地址将不会再改变。
public class TestFinal {
public static final User user = new User("user one");
public static void main(String [] args) {
user.setName("user two");//final对象一经赋值,不可改变其在内存中的指向,但可以改变对象状态。
System.out.println(user.getName());
user = new User("user three");//这一步编译错误,最终变量不可再次赋值
}
}
class User {
private String name;
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

其次,线程安全和加不加final没有什么区别,打个经典的比方,两个人同时看到了桌上的一个蛋糕,于是两个人都坐下并拿起刀叉,但实际上有个人在叉向蛋糕的一瞬间,这个蛋糕被另一个人吃掉了,这就引起了错误,具体的例子还有很多。
解决线程安全的方法有好几个,比如楼主需要将所有操作此变量的方法加上排他锁,即方法声明时加上synchronized关键词(前提是这几个方法与这个需要保护的变量处在同一个类中)

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧