导航:首页 > 编程语言 > java单例例子

java单例例子

发布时间:2023-09-05 11:24:34

java中哪些对象都是单例模式

下面列出一部分Java的单抄例类:
1)Runtime类
可以袭通过java.lang.Runtime#getRuntime()获取其实例
2)Desktop类
可以通过java.awt.Desktop#getDesktop()获取其实例
3)SecurityManager类,注意,虽然该类提供了公共无参构造函数,但其内部构造函数仍然以单例的模式在运行。可以说是单例的一种变形设计。
可以通过java.lang.System#getSecurityManager()获取其实例

❷ 如何在Java中实现单例模式

单例模式1:
public
class
singleton{
private
static
singleton
st
=
null;
private
singleton(){
}
public
static
singleton
getinstance(){
if(st
==
null){
st
=
new
singleton();
}
return
st;
}
}
单例模式2:
public
class
singleton{
private
static
singleton
st
=
new
singleton();
private
singleton(){
}
public
static
singleton
getinstance(){
return
st;
}
}
多线程1:
导入thread所在的包
public
class
mythread1
extends
thread{
public
void
run(){
xxxxx写自己的代码
}
}
多线程2
导入runnable所在的包
public
class
mythread2
implements
runnable{
public
void
run(){
xxxxx写自己的代码
}
}
另写一个测试类,在main方法中这样写:
thread
t
=
new
mythread1();
或者
runnable
r
=
new
mythread2();
thread
t
=
new
thread(r);

❸ java中的单例模式的代码怎么写

我从我的博客里把我的文章粘贴过来吧,对于单例模式模式应该有比较清楚的解释:
单例模式在我们日常的项目中十分常见,当我们在项目中需要一个这样的一个对象,这个对象在内存中只能有一个实例,这时我们就需要用到单例。

一般说来,单例模式通常有以下几种:

1.饥汉式单例

public class Singleton {
private Singleton(){};
private static Singleton instance = new Singleton();
public static Singleton getInstance(){
return instance;
}
}

这是最简单的单例,这种单例最常见,也很可靠!它有个唯一的缺点就是无法完成延迟加载——即当系统还没有用到此单例时,单例就会被加载到内存中。
在这里我们可以做个这样的测试:

将上述代码修改为:

public class Singleton {
private Singleton(){
System.out.println("createSingleton");
};
private static Singleton instance = new Singleton();
public static Singleton getInstance(){
return instance;
}
public static void testSingleton(){
System.out.println("CreateString");
}
}

而我们在另外一个测试类中对它进行测试(本例所有测试都通过Junit进行测试)

public class TestSingleton {
@Test
public void test(){
Singleton.testSingleton();
}
}

输出结果:

createSingleton
CreateString

我们可以注意到,在这个单例中,即使我们没有使用单例类,它还是被创建出来了,这当然是我们所不愿意看到的,所以也就有了以下一种单例。

2.懒汉式单例

public class Singleton1 {
private Singleton1(){
System.out.println("createSingleton");
}
private static Singleton1 instance = null;
public static synchronized Singleton1 getInstance(){
return instance==null?new Singleton1():instance;
}
public static void testSingleton(){
System.out.println("CreateString");
}
}

上面的单例获取实例时,是需要加上同步的,如果不加上同步,在多线程的环境中,当线程1完成新建单例操作,而在完成赋值操作之前,线程2就可能判
断instance为空,此时,线程2也将启动新建单例的操作,那么多个就出现了多个实例被新建,也就违反了我们使用单例模式的初衷了。

我们在这里也通过一个测试类,对它进行测试,最后面输出是

CreateString

可以看出,在未使用到单例类时,单例类并不会加载到内存中,只有我们需要使用到他的时候,才会进行实例化。

这种单例解决了单例的延迟加载,但是由于引入了同步的关键字,因此在多线程的环境下,所需的消耗的时间要远远大于第一种单例。我们可以通过一段测试代码来说明这个问题。

public class TestSingleton {
@Test
public void test(){
long beginTime1 = System.currentTimeMillis();
for(int i=0;i<100000;i++){
Singleton.getInstance();
}
System.out.println("单例1花费时间:"+(System.currentTimeMillis()-beginTime1));
long beginTime2 = System.currentTimeMillis();
for(int i=0;i<100000;i++){
Singleton1.getInstance();
}
System.out.println("单例2花费时间:"+(System.currentTimeMillis()-beginTime2));
}
}

最后输出的是:

单例1花费时间:0
单例2花费时间:10

可以看到,使用第一种单例耗时0ms,第二种单例耗时10ms,性能上存在明显的差异。为了使用延迟加载的功能,而导致单例的性能上存在明显差异,
是不是会得不偿失呢?是否可以找到一种更好的解决的办法呢?既可以解决延迟加载,又不至于性能损耗过多,所以,也就有了第三种单例:

3.内部类托管单例

public class Singleton2 {
private Singleton2(){}
private static class SingletonHolder{
private static Singleton2 instance=new Singleton2();
}
private static Singleton2 getInstance(){
return SingletonHolder.instance;
}
}

在这个单例中,我们通过静态内部类来托管单例,当这个单例被加载时,不会初始化单例类,只有当getInstance方法被调用的时候,才会去加载
SingletonHolder,从而才会去初始化instance。并且,单例的加载是在内部类的加载的时候完成的,所以天生对线程友好,而且也不需要
synchnoized关键字,可以说是兼具了以上的两个优点。

4.总结

一般来说,上述的单例已经基本可以保证在一个系统中只会存在一个实例了,但是,仍然可能会有其他的情况,导致系统生成多个单例,请看以下情况:

public class Singleton3 implements Serializable{
private Singleton3(){}
private static class SingletonHolder{
private static Singleton3 instance = new Singleton3();
}
public static Singleton3 getInstance(){
return SingletonHolder.instance;
}
}

通过一段代码来测试:

@Test
public void test() throws Exception{
Singleton3 s1 = null;
Singleton3 s2 = Singleton3.getInstance();
//1.将实例串行话到文件
FileOutputStream fos = new FileOutputStream("singleton.txt");
ObjectOutputStream oos =new ObjectOutputStream(fos);
oos.writeObject(s2);
oos.flush();
oos.close();
//2.从文件中读取出单例
FileInputStream fis = new FileInputStream("singleton.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
s1 = (Singleton3) ois.readObject();
if(s1==s2){
System.out.println("同一个实例");
}else{
System.out.println("不是同一个实例");
}
}

输出:

不是同一个实例

可以看到当我们把单例反序列化后,生成了多个不同的单例类,此时,我们必须在原来的代码中加入readResolve()函数,来阻止它生成新的单例

public class Singleton3 implements Serializable{
private Singleton3(){}
private static class SingletonHolder{
private static Singleton3 instance = new Singleton3();
}
public static Singleton3 getInstance(){
return SingletonHolder.instance;
}
//阻止生成新的实例
public Object readResolve(){
return SingletonHolder.instance;
}
}

再次测试时,就可以发现他们生成的是同一个实例了。

❹ java 中 单实例和多实例是指的什么

简单的说单例就是
只能有一个实例,所以地方用到的实例都是同一个。
就好像家人吃饭,桌子是单例的,大家用的是同一个。而碗是多例的,每人都有自几的。
下面是具体的例子:
Java模式之单例模式:

单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例。

特点:

1,一个类只能有一个实例

2,自己创建这个实例

3,整个系统都要使用这个实例

例:
在下面的对象图中,有一个"单例对象",而"客户甲"、"客户乙"
和"客户丙"是单例对象的三个客户对象。可以看到,所有的客户对象共享一个单例对象。而且从单例对象到自身的连接线可以看出,单例对象持有对自己的引用。

Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。在很多操作中,比如建立目录
数据库连接都需要这样的单线程操作。一些资源治理器经常设计成单例模式。

外部资源:譬如每台计算机可以有若干个打印机,但只能有一个Printer
Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干个通信端口,系统应当集中治理这些通信端口,以避免一个通信端口被两个请求同时调用。内部资源,譬如,大多数的软件都有一个(甚至多个)属性文件存放系统配置。这样的系统应当由一个对象来治理这些属性文件。一个例子:Windows
回收站。
在整个视窗系统中,回收站只能有一个实例,整个系统都使用这个惟一的实例,而且回收站自行提供自己的实例。因此,回收站是单例模式的应用。
两种形式:
1,饿汉式单例类
public
class
Singleton
{
private
Singleton(){}
//在自己内部定义自己一个实例,是不是很希奇?

//注重这是private
只供内部调用
private
static
Singleton
instance
=
new
Singleton();
//这里提供了一个供外部访问本class的静态方法,可以直接访问

public
static
Singleton
getInstance()
{

return
instance;

}
}
2,懒汉式单例类
public
class
Singleton
{
private
static
Singleton
instance
=
null;
public
static
synchronized
Singleton
getInstance()
{
//这个方法比上面有所改进,不用每次都进行生成对象,只是第一次

//使用时生成实例,提高了效率!

if
(instance==null)

instance=new
Singleton();

return
instance;
}
}
第二中形式是lazy
initialization,也就是说第一次调用时初始Singleton,以后就不用再生成了。
注重到lazy
initialization形式中的synchronized,这个synchronized很重要,假如没有synchronized,那么使用getInstance()是有可能得到多个Singleton实例。
一般来说第一种比较安全。进入讨论组讨论。

❺ 如何在Java中实现单例模式

单例模式能如上面代码中的实现方式,最主要依赖于我们可以在私有的构造器中完成初始化的任务,而需要延迟或是从外部获取相关的参数。否则,我们就必须要采取延迟初始化的方式,一种典型实现方式的代码如下:
public class Configuration {
private static final Configuration instance = null;
private Configuration() {
// init}
public static Configuration getInstnace() {
if (instance == null) {
instance = new Configuration();}
return instance;}
// .. other methods}
注意getInstance方法,我们增加了一个if语句来实现延长初始化和只初始化一次。这段代码在单线程的情况下是没有问题的,但如果放在多线程中,就有可能产生多个Configuration实例了,从而破坏单例模式,是系统可能产生数据不一致的结果。如果解决在多线程里的问题,我们在下一篇文章中再为大家分析。
,本站保留追究责任的权利。

❻ java中怎么写一个单例的例子

单例就是把构造方法私有化,在类里实例化对象,并且给一个共有的能返回回这个对答象的方法
public class Single{
private Single s = null;
private Single(){
}
public static synchronized Single getS(){
if (s == null) {
s = new Singleton();
}
return s;
}
}

阅读全文

与java单例例子相关的资料

热点内容
网络如何把人捧红 浏览:961
软件传输文件 浏览:184
密码记录器ios 浏览:412
两个电脑数据怎么一样 浏览:829
顺丰有什么买东西的app 浏览:377
数位板word 浏览:939
win7宽带连接出现多重网络 浏览:268
更改程序图标c语言 浏览:629
网络电视偷停怎么办 浏览:418
linux连接ftp 浏览:512
es文件浏览器视频笔记 浏览:874
mac无法打开描述文件 浏览:134
什么软件打文件 浏览:53
数据库无数据变成0 浏览:899
名企笔试如何刷编程题 浏览:49
js跳到页面某地 浏览:550
jsp展示clob字段 浏览:779
nyx在网络上是什么意思 浏览:145
乐播农业app是什么 浏览:530
编程框架如何开发 浏览:136

友情链接