当前位置:首页 » 编程语言 » java单例线程

java单例线程

发布时间: 2023-05-25 11:44:39

java线程安全的单例模式的几种实现

四种线程安全的单例模式实现方式,其实并不局限于这四种,本文只是起一个抛砖引玉的作用。

㈡ java,单例对象的方法可以被多个线程同时调用吗

同时是不可能的芹蔽旦,[单例]这个词已经限定了,同一时刻只能有一个线程在访问!其他一定在等待前者访问结束!
很简单,假如你说的成立,如果A正在修改,B正在访问,数据一定错误!
单列是一种
设计嫌扰模式
,在你生成这个对象时候就已经限定了,同一时刻,只允许一条线程访问并念!
如果你没达到这个限定,那就不叫单列;
也就是说在你写单列的时候,就已经考虑到
线程安全
问题!

㈢ 在java开发中,为什么要使用单例模式

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

特点:

  1. 一个类只能有一个实例;

  2. 自己创建这个实例;

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

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

外部资源:譬如每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干个通信端口,系统应当集中管理这些通信端口,以避免一个通信端口被两个请求同时调用。

内部资源,譬如,大多数的软件都有一个(甚至多个)属性文件存放系统配置。这样的系统应当由一个对象来管理这些属性文件。

单例模式,能避免实例重复创建;

单例模式,应用于避免存在多个实例引起程序逻辑错误的场合;

单例模式,较节约内存。

㈣ Java的单例模式是不是线程安全的

单例也不能保证100%线程安全的。解决方法就是创建实例方法中加入Java关键字synchronized。
Java语言的关键字synchronized,可丛轿用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的渗薯肆时手顷候,同一时刻最多只有一个线程执行这段代码。当两个并发线程访问同一个对象object中的这个加锁同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。然而,当一个线程访问object的一个加锁代码块时,另一个线程仍然可以访问该object中的非加锁代码块。

㈤ Java如何为每个线程提供一个单例

JAVA的单例模式只不过是让这个类只能够实例化一个对象就可以了,只要满足这个要求就是单例模式,如脊顷果你写的严谨点就是线程安全的,不严谨察裤就是线程不安全的。而且单例败野简模式还分为懒汉式单例模式和饿汉式单例模式

㈥ Java 中几种常用的线程池

一:newCachedThreadPool
(1)缓存型池子,先查看池中有没有以前建立的线程,如果有,就reuse,如果没有,就建立一个新的线程加入池中;
(2)缓存型池子,通常用于执行一些生存周期很短的异步型任务;因此一些面向连接的daemon型server中用得不多;
(3)能reuse的线程,必须是timeout IDLE内的池中线程,缺省timeout是60s,超过这个IDLE时长,线程实例将被终止及移出池。
(4)注意,放入CachedThreadPool的线程不必担心其结束,超过TIMEOUT不活动,其会自动被终止

二:newFixedThreadPool
(1)newFixedThreadPool与cacheThreadPool差不多,也是能reuse就用,但不能随时建新的线程
(2)其独特之处胡清贺:任意时间点,最多只能有固定数目的活动线程存在,此时如果有新的线程要建立,只能放在另外的队列中等待,直到当前的线程中某个线程终止直接被移出池子
(3)和正歼cacheThreadPool不同,FixedThreadPool没有IDLE机制(可能也有,但既然文档没提,肯定非常长,类似依赖上层的TCP或UDP IDLE机制之类的),所以FixedThreadPool多数针对一些很裤派稳定很固定的正规并发线程,多用于服务器
(4)从方法的源代码看,cache池和fixed 池调用的是同一个底层池,只不过参数不同:
fixed池线程数固定,并且是0秒IDLE(无IDLE)
cache池线程数支持0-Integer.MAX_VALUE(显然完全没考虑主机的资源承受能力),60秒IDLE

三:ScheledThreadPool
(1)调度型线程池
(2)这个池子里的线程可以按schele依次delay执行,或周期执行
四:SingleThreadExecutor
(1)单例线程,任意时间池中只能有一个线程
(2)用的是和cache池和fixed池相同的底层池,但线程数目是1-1,0秒IDLE(无IDLE)

㈦ 关于JAVA单例的问题

这个问题由最开始使用JACKSON JSON而衍生出来 因为官网上建议将ObjectMapper作为全局变量使用从而提高效率 所以 我们项目里面使用了单例 在使用单例的时候 我们无可厚非的考虑了资源在使用时是否要保证互斥的情况

最开始的写法

Java代码

public final class JacksonJsonMapper {

static volatile ObjectMapper objectMapper = null;

private JacksonJsonMapper(){}

public static ObjectMapper getInstance(){

if (objectMapper==null){

objectMapper = new ObjectMapper();

}

return objectMapper;

}

}

在此期间 我考虑了两个问题 并与团队中的另外一个兄弟发生了激烈的讨论

在使用getInstance()方法的时候 是否要使用synchronized关键字

在使用objectMapper writeValueAsString(object)时 因为此方法非静态方法 在此方法内是否会使用到对象自有的属性 而在并发的时候出现前者属性被后者银并搏覆盖的问题

后再看了源码后 排除了第锋祥二个顾虑 ObjectMapper是与线程绑定的 所以是线程安全的 并且也在官网的线程安全介绍中得到了证实

Jackson follows thread safety rules typical for modern factory based Java data format handlers (similar to what say Stax or JAXP implementations do) For example:

Factories (ObjectMapper JsonFactory) are thread safe once configured: so ensure that all configuration is done from a single thread and before instantiating anything with factory

Reader/writer instances (like JsonParser and JsonParser) are not thread safe there is usually no need for them to be but if for some reason you need to access them from multiple threads external synchronization is needed

All transformer objects (custom serializers deserializers) are expected to be stateless and thereby thread safe state has to be stored somewhere outside instances (in ThreadLocal or context objects passed in like DeserializationContext)

第一个顾虑在看完下面这篇文章蔽漏后 得到了解决方法

l

Java代码

public final class JacksonJsonMapper {

static volatile ObjectMapper objectMapper = null;

private JacksonJsonMapper(){}

public static ObjectMapper getInstance(){

if (objectMapper==null){

synchronized (ObjectMapper class) {

if (objectMapper==null){

objectMapper = new ObjectMapper();

}

}

}

return objectMapper;

}

}

lishixin/Article/program/Java/gj/201311/27515

㈧ Java模式设计之单例模式(一)

作为对象的创建模式[GOF ] 单例模式确保某一个类只有一个实例 而且自行实例化并向整个系统提供这个实例 这个类称为单例类

单例模式的要点

单例单例

显然单例模式的要点有三个 一是某各类只能有一个实例 二是它必须自行创建这个事例 三是它必须自行向整个系统提供这个实例 在下面的对象图中 有一个 单例对象 而 客户甲 客户乙 和 客户丙 是单例对象的三个客户对象 可以看到 所有的客户对象共享一个单例对象 而且从单例对象到自身的连接线可以看出 单例对象持有对自己的引用

资源管理

一些资源管理器常常设计成单例模式

在计算机系统中 需要管理的资源包括软件外部资源 譬如每台计算机可以有若干个打印机 但只能有一个Printer Spooler 以避免两个打印作业同时输出到打印机中 每台计算机可以有若干传真卡 但是只应该有一个软件负责管理传真卡 以避免出现两份传真作业同时传到传真卡中的情况 每台计算机可以有若干通信端口 系统应当集中管理这些通信端口 以避免一个通信端口同时被两个请求同时调用

需要管理的资源包括软件内部资源 譬如 大多数的软件都有一个(甚至多个)属性(properties)文件存放系统配置 这样的系统应当由一个对象来管理一个属性文件

需要管理的软件内部资源也包括譬如负责记录网站来访人数的部件 记录软件系统内部事件 出错信息的部件 或是对系统的表念蚂现进行检查的部件等 这些部件都必须集中管理 不可政出多头

这些资源管理器构件必须只有一个实例 这是其一 它们必须自行初始化 这是其二 允许整个系统访问自己这是其三 因此 它们都满足单例模式的条件 是单例模式的应用

一个例子 Windows 回收站

Windows x 以后的视窗系统中都有一个回收站 下图就显示了Windows 的回收站

在整个视窗系尘高核统中 回收站只能有一个实例 整个系统都使用这个惟一的实例 而且回收站自行提供自己的实例 因此 回收站是单例模式的应用

双重检查成例

在本章最后的附录里研究了双重检查成例 双重检查成例与单例模式并无直接的关系 但是由于很多C 语言设计师在单例模式里面使用双重检查成例 所以这一做法也被很多Java 设计师所模仿 因此 本书在附录里提醒读者 双重检查成例在Java 语言里并不能成立 详情请见本章的附录

单例模式的结构

单例模式有以下的特点

…… 单例类只可有一个实例

…… 单例类必须自己创建自己这惟一的实例

…… 单例类必须给所有其他对象提供这一实例

虽然单例模式中的单例类被限定只能有一个实例 但是单例模式和单例类可以很容易被推广到任意且有限多个实例的情况 这时候称它为多例模式(Multiton Pattern) 和多例类(Multiton Class) 请见 专题 多例(Multiton )模式与多语言支持 一章 单例类的简略类图如下所示

由于Java 语言的特点 使得单例模式在Java 语言的实现上有自己的特点 这些特点主要表现在单例类如何将自己实例化上

饿汉式单例类饿汉式单例类是在Java 语言里实现得最为简便的单例类 下面所示的类图描述了一个饿汉式单例类的典型实现

从图中可以看出 此类已经自已将自己实例化

代码清单 饿汉式单例类

public class EagerSingleton { private static final EagerSingleton m_instance = new EagerSingleton() /** * 私有的默认构造子*/ private EagerSingleton() { } /** * 静态工厂方法*/ public static EagerSingleton getInstance()

{

Java 与模式return m_instance }

读者可以看出 在这个类被加载时 静态变量m_instance 会被初始化 此时类的私有构造子会被调用 这时候 单例类的惟一实例就被创建出来了

Java 语言中单例类的一个最重要的特点是类派掘的构造子是私有的 从而避免外界利用构造子直接创建出任意多的实例 值得指出的是 由于构造子是私有的 因此 此类不能被继承

懒汉式单例类

与饿汉式单例类相同之处是 类的构造子是私有的 与饿汉式单例类不同的是 懒汉式单例类在第一次被引用时将自己实例化 如果加载器是静态的 那么在懒汉式单例类被加载时不会将自己实例化 如下图所示 类图中给出了一个典型的饿汉式单例类实现

代码清单 懒汉式单例类

package javapatterns singleton demos public class LazySingleton { private static LazySingleton m_instance = null /** * 私有的默认构造子 保证外界无法直接实例化*/ private LazySingleton() { } /** * 静态工厂方法 返还此类的惟一实例*/ synchronized public static LazySingleton getInstance()

{ if (m_instance == null)

{ m_instance = new LazySingleton() } return m_instance }

读者可能会注意到 在上面给出懒汉式单例类实现里对静态工厂方法使用了同步化 以处理多线程环境 有些设计师在这里建议使用所谓的 双重检查成例 必须指出的是 双重检查成例 不可以在Java 语言中使用 不十分熟悉的读者 可以看看后面给出的小节

同样 由于构造子是私有的 因此 此类不能被继承 饿汉式单例类在自己被加载时就将自己实例化 即便加载器是静态的 在饿汉式单例类被加载时仍会将自己实例化 单从资源利用效率角度来讲 这个比懒汉式单例类稍差些

从速度和反应时间角度来讲 则比懒汉式单例类稍好些 然而 懒汉式单例类在实例化时 必须处理好在多个线程同时首次引用此类时的访问限制问题 特别是当单例类作为资源控制器 在实例化时必然涉及资源初始化 而资源初始化很有可能耗费时间 这意味着出现多线程同时首次引用此类的机率变得较大

饿汉式单例类可以在Java 语言内实现 但不易在C++ 内实现 因为静态初始化在C++ 里没有固定的顺序 因而静态的m_instance 变量的初始化与类的加载顺序没有保证 可能会出问题 这就是为什么GoF 在提出单例类的概念时 举的例子是懒汉式的 他们的书影响之大 以致Java 语言中单例类的例子也大多是懒汉式的 实际上 本书认为饿汉式单例类更符合Java 语言本身的特点

登记式单例类

登记式单例类是GoF 为了克服饿汉式单例类及懒汉式单例类均不可继承的缺点而设计的 本书把他们的例子翻译为Java 语言 并将它自己实例化的方式从懒汉式改为饿汉式 只是它的子类实例化的方式只能是懒汉式的 这是无法改变的 如下图所示是登记式单例类的一个例子 图中的关系线表明 此类已将自己实例化

代码清单 登记式单例类

import java util HashMap public class RegSingleton { static private HashMap m_registry = new HashMap() static { RegSingleton x = new RegSingleton() m_registry put( x getClass() getName() x) } /** * 保护的默认构造子*/ protected RegSingleton() {} /** * 静态工厂方法 返还此类惟一的实例*/ static public RegSingleton getInstance(String name)

{ if (name == null)

{ name = javapatterns singleton demos RegSingleton } if (m_registry get(name) == null)

{ try { m_registry put( name Class forName(name) newInstance() ) } catch(Exception e)

{ System out println( Error happened ) } return (RegSingleton) (m_registry get(name) ) } /** * 一个示意性的商业方法*/ public String about()

{ return Hello I am RegSingleton }它的子类RegSingletonChild 需要父类的帮助才能实例化 下图所示是登记式单例类子类的一个例子 图中的关系表明 此类是由父类将子类实例化的

下面是子类的源代码

代码清单 登记式单例类的子类

import java util HashMap public class RegSingletonChild extends RegSingleton { public RegSingletonChild() {} /** * 静态工厂方法*/ static public RegSingletonChild getInstance()

{ return (RegSingletonChild)

RegSingleton getInstance( javapatterns singleton demos RegSingletonChild ) } /** * 一个示意性的商业方法*/ public String about()

{ return Hello I am RegSingletonChild }

在GoF 原始的例子中 并没有getInstance() 方法 这样得到子类必须调用的getInstance(String name)方法并传入子类的名字 因此很不方便 本章在登记式单例类子类的例子里 加入了getInstance() 方法 这样做的好处是RegSingletonChild 可以通过这个方法 返还自已的实例 而这样做的缺点是 由于数据类型不同 无法在RegSingleton 提供这样一个方法 由于子类必须允许父类以构造子调用产生实例 因此 它的构造子必须是公开的 这样一来 就等于允许了以这样方式产生实例而不在父类的登记中 这是登记式单例类的一个缺点

lishixin/Article/program/Java/gj/201311/27416

㈨ 什么是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,以后就不用再生成了。

热点内容
商务pc配置低什么很稳定 发布:2025-07-14 10:03:13 浏览:894
火狐浏览器安卓版怎么全屏播放 发布:2025-07-14 10:03:13 浏览:163
c语言中π怎么打 发布:2025-07-14 09:56:35 浏览:574
颜料解压 发布:2025-07-14 09:49:57 浏览:463
python按任意键 发布:2025-07-14 09:49:19 浏览:291
内置存储交换位置 发布:2025-07-14 09:33:10 浏览:647
甲壳虫密码如何解锁 发布:2025-07-14 09:23:55 浏览:823
解压专家解压迅雷云盘 发布:2025-07-14 09:11:09 浏览:910
编程基础教学 发布:2025-07-14 09:09:48 浏览:94
电脑板能进入的手机版服务器 发布:2025-07-14 09:08:10 浏览:555