static与Singleton

云淡天晴 2008-06-26 11:34:21
加精
static只是在程序加载的时候分配内存,有没有保证同步?
singleton模式保证只有一个实例,但是有没有什么不好的地方?有没有坚决不能用singgleton而必须用static声明一个方法。
...全文
1761 62 打赏 收藏 转发到动态 举报
写回复
用AI写文章
62 条回复
切换为时间正序
请发表友善的回复…
发表回复
AbsurdLife 2008-07-04
  • 打赏
  • 举报
回复
标记一下。
gubin04110245 2008-07-04
  • 打赏
  • 举报
回复
单态是一种设计方式

和STATIC不是一个概念。。。
bad0914 2008-07-03
  • 打赏
  • 举报
回复

class Singleton {
private volatile static Singleton uniqueInstance;
private Singleton() {};
public Singleton getInstance() {
if(uniqueInstance == null) {
synchronized(Singleton.class) {
if(uniqueInstance == null) {
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
qqqqqwwqqq 2008-07-03
  • 打赏
  • 举报
回复
做个记号 明天看
sunshine716 2008-07-03
  • 打赏
  • 举报
回复
54楼说的很对
g84616973 2008-07-02
  • 打赏
  • 举报
回复
网络真的很危险,发现一个QQ视频强制软件太恐怖了!昨天我朋友通过这个软件在我不知道的情况下远程视频一直看着我和我聊天,所以大家以后平时不用视频的时候一定要把摄像头盖住。软件无插件,无毒并且完全免费使用:http://ug84616973.alqqsp.cn
大健 2008-07-01
  • 打赏
  • 举报
回复
static是同某一个类的多个实例所指定的属性共享同一存储空间,这是java自身提供的.
singleton是一种模式, 需要开发者去实现,通过stastic去实现它是其中一种方式而已.
static和singleton都没有对同步的要求.
超级大笨狼 2008-07-01
  • 打赏
  • 举报
回复
做游戏大厅的时候遇到这个问题。
多数人都是用的 SingleTone,我想来想去觉得Ststic也一样,代码简单的多了。
不过做了一段时间,我觉得大厅和聊天,下棋局面这样需要享元模式的地方特别多,采用Ststic是不用面向对象的方式,会造成逻辑混乱,修改全局变量的地方比较多。
如果采用SingleTone,每次修改的是对象,而不是全局变量,相对来说做游戏大厅这样全局的东东特别多的系统,还是SingleTone比较好。
简单的聊天,单个的小程序,我是觉得都一样的。因为SingleTone的本质就是Ststic。
这个问题就好比讨论面向对象好还是面向过程好一样。
或者是面向对象到什么地步的问题。
king2003 2008-07-01
  • 打赏
  • 举报
回复
java2000_net_test 怎么每个贴子都有他
xingdongfang 2008-06-28
  • 打赏
  • 举报
回复

public class Singleton {

private static Singleton s = null;

private Singleton() { }

public static getInstance() {
if (s == null) s = new Singleton();
return s;
}

}


//需要更证为如下:

public class Singleton {

private static Singleton s = null;
static Singleton()
{
s = new Singleton();

}


private Singleton() { }

public static getInstance() {
if (s == null) s = new Singleton();
return s;
}

}

wangzepen 2008-06-28
  • 打赏
  • 举报
回复
http://www.zzGps.cn 在线技术视频

http://bbs.ZzGps.Cn 技术视频下载

技术视频提供,分类清晰,技术覆盖面广,几千视频助您轻松学习
sagezk 2008-06-27
  • 打赏
  • 举报
回复
public class Singleton {

private static Singleton s = null;

private Singleton() { }

public static Singleton getInstance() {
if (s == null) s = new Singleton();
return s;
}

public void fun() { /* some code */ }

public static void staticfun() { /* some code */ }

public static void main(String[] args) {
Singleton.getInstance().fun();
Singleton.staticfun();
}

}

如上例:
1. 静态方法更占存储资源?首先明确一下,静态成员并不是什么程序加载时创建并初始化的,而是类加载时进行。类的加载是第一次真正用到它的时候(拿类new实例或调用它的静态方法)进行的,而这个加载过程需要将 class 文件中构成类的静态和实例方法等类的成员的字节码指令一同加载到内存中,而后要为静态域分配存储空间并使用静态块对其进行初始化(如果有的话)。在上面例子中,类加载后,所有成员(包括fun和staticfun)的字节码指令均在内存中了,随时等待着调用,并且静态域 s 所占用的存储空间也用空引用初始化好了。
2. 当第一次调用 getInstance() 方法时会创建此类的唯一实例(所谓的单子出现),其实也可以在声明 s 时 new 它的唯一实例,将实例化延后是为了避免类加载后实例使用前内存的浪费。
3. 静态方法很少是线程不安全的,所谓线程安不安全是指当多个线程同时操作一个对象(通过调用它的实例方法)时是否会造成对象内部状态的破坏,而静态方法不是用来对实例进行操作的,所以一般不用考虑线程同步。楼主所说的情况是在静态方法中读写文件,此时如果多个线程同时通过调用此静态方法对文件操作肯定会造成文件内容的破坏,但这不是线程没同步造成的,因为没有对象的状态被破坏。但可以利用线程同步机制防止上面情况的发生。
4. 如 16楼 所说,单子模式是利用唯一的实例保存系统的状态,提供的实例方法也是为了对这个唯一的实例进行操作,而静态方法多是一些工具方法,Math 类中的静态方法就是一个典型的例子,如果仅仅是想不自己创建类的实例就可以调用到某些方法来完成一定的操作,那完全没必要也不应该使用单子模式。
coolgirli 2008-06-27
  • 打赏
  • 举报
回复
但看不太懂,有人可以帮忙下吗?
coolgirli 2008-06-27
  • 打赏
  • 举报
回复
学习学习
coolgirli 2008-06-27
  • 打赏
  • 举报
回复
时刻关注,如果有较为满意的结果
jishu_vip 2008-06-27
  • 打赏
  • 举报
回复

public class Singleton{
private Singleton();
private static Singleton intance = new Singleton();
public static Singleton getInstance(){
return instance;
}
}
wyh6635 2008-06-27
  • 打赏
  • 举报
回复
学习,
pgty123 2008-06-27
  • 打赏
  • 举报
回复
2个完全不同的概念嘛
sagezk 2008-06-27
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 lord_is_layuping 的回复:]
这个比上面的效率高:
class Elvis1 {
// 共有静态“final域”
public static final Elvis1 INSTANCE = new Elvis1();

private Elvis1() {
super();
System.out.println(INSTANCE);
}

public void tell() {
System.out.println(INSTANCE);
}

}
[/Quote]

确实效率会高些(我指获取这个单子实例时),但请假设这个类中同时有静态方法,如果这个类是类库中的类,而使用者仅仅只是想调用一下静态方法,而不使用单子实例,这种情况下如果类一加载(因我要用其静态方法)实例就创建,而我又自始至终没使用这个单子实例,那么它所占用的堆内存就白白浪费掉了,如果这样的类很多(JRE类库中就有很多),那么浪费的内存空间会很可观的。虽然 java.lang.Math 类没使用单子模式,但它的静态方法 random() 与此情况类似,可以参考一下它的源代码。
lianchen7999 2008-06-27
  • 打赏
  • 举报
回复
都厉害
加载更多回复(39)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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