- 浏览: 460908 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (369)
- javascript html (20)
- java (31)
- jquery (15)
- jcrop (0)
- JEECG (1)
- ajax (3)
- 反射 (3)
- VI (1)
- mysql (48)
- easyui (1)
- svn (2)
- MD5 加密 (1)
- spring (14)
- ORACLE (8)
- 经验总结 (1)
- TCP/IP协议 (1)
- ICMP协议 (1)
- eclipse (1)
- Reflect (1)
- linux (21)
- android (5)
- excel 操作 (1)
- java tree (1)
- html (1)
- plupload (1)
- mongodb (9)
- aes (1)
- python (1)
- java relax (1)
- highcharts (2)
- json (2)
- java 多线程 (30)
- maven (2)
- 设计模式 (1)
- jsp+js (2)
- 面向对象 (1)
- jvm (16)
- 缓存 (1)
- proxy (1)
- 聊侃 (1)
- 面经 (1)
- java 字节 (1)
- java 类加载器 (2)
- java 基础 (2)
- java 语法糖 (1)
- java 位运算 (1)
- 排序 (3)
- java 服务器性能优化 (19)
- 网络编程 (2)
- jvm 参数设置 (0)
- jersey (1)
- webservice (2)
- nginx+多tomcat 集成 (5)
- nginx (16)
- squid (3)
- memcached (5)
- 正则表达式 (1)
- 常用免费接口 (1)
- jpa (1)
- win7 (1)
- java处理大文件 (1)
- js正则表达式 (1)
- tomcat (1)
- java 敏感字 (1)
- 系统架构优化 (4)
- 学习 (1)
- 本地测试QQ微博第三方登陆 (1)
- java 错误 (1)
- 微信支付 (1)
- https (1)
- httpclient (1)
- awk (2)
- loadrunner (1)
- sql server 2008 (3)
- git (4)
- sql server2008 (1)
- solr (2)
- centos (1)
- 数据存储架构 (3)
- log4j (1)
- weboffice (1)
- 并发编程 (1)
- postgreSQL (0)
- ssl (1)
- openssl (1)
- activeMQ (2)
- IDEA (1)
- shell (1)
- ansible (4)
- docker (2)
- grafana (1)
- jmeter (1)
- TLS (1)
- 将博客搬至CSDN (1)
最新评论
-
dida1990:
啊喔,过去了这么久,不过还是评一个。谁说uuid的hashCo ...
高并发生成订单号(二) -
annan211:
yclovesun 写道使用了uuid,为什么还要machin ...
高并发生成订单号(二) -
yclovesun:
使用了uuid,为什么还要machineId?uuid已经可以 ...
高并发生成订单号(二) -
u013280917:
太深奥,看不懂
mysql优化特定类型的查询
单例模式的创建 分为很多种,这里就不一一列举,这里简单分析一下单例模式的效率和线程安全性。
传统的单例模式是
为了 实现 线程安全性,出现了如下的 进化
但是上面代码的开销 有点不合适,因为每个线程 都会来判断锁。所以 出现了 双重判定。
但是 判断锁 还是存在的,如果我们仅仅是需要在 一种比较合理的,没有特殊情况发生的环境下 创建单例,是不是有那么一种方法,不需要出现判断锁的呢?(这里所说的 特殊情况是指,通过反射机制,强行调用私有构造函数,创建多个实例,还有一种情况就是 序列化和反序列化(通过串行方式))
假定我们假设以上的情况是不多见或者说 在我们的程序当中是不存在不会发生的,那么我们的代码可以有如下实现。
通过代码 我们可以观察出,这段代码是通过内部类的形式 来实现单例的。
在这实现中,单例模式通过内部类来维护单例的实例,当SingletoDemo 外部类被加载 时,
其内部类并不会被初始化,故可以确保外部类被载入jvm时,其内部类不会被初始化,当getInstance()方法被调用时,才会加载内部类从而初始化单例对象,
由于实例的创建是在类加载时完成,因此天生对多线程友好,所以可以省去synchronized关键字。
使用内部类实现单例,既可以实现延迟加载,又可以省去synchronized关键字实现同步,是一种比较完善的实现方式。
但是 我们必须注意上面所说的 特殊情况。
传统的单例模式是
package thread; public class SingletoDemo { public static SingletoDemo instance = null; /** * 私有化 */ private SingletoDemo(){} public static SingletoDemo getInstance(){ if(instance == null){ instance = new SingletoDemo(); } return instance; } }
为了 实现 线程安全性,出现了如下的 进化
package thread; public class SingletoDemo { public static SingletoDemo instance = null; /** * 私有化 */ private SingletoDemo(){} public static synchronized SingletoDemo getInstance(){ if(instance == null){ instance = new SingletoDemo(); } return instance; } }
但是上面代码的开销 有点不合适,因为每个线程 都会来判断锁。所以 出现了 双重判定。
package thread; public class SingletoDemo { public static SingletoDemo instance = null; /** * 私有化 */ private SingletoDemo(){} public static SingletoDemo getInstance(){ if(instance == null ){ synchronized(SingletoDemo.class){ if(instance == null){ instance = new SingletoDemo(); } } } return instance; } }
但是 判断锁 还是存在的,如果我们仅仅是需要在 一种比较合理的,没有特殊情况发生的环境下 创建单例,是不是有那么一种方法,不需要出现判断锁的呢?(这里所说的 特殊情况是指,通过反射机制,强行调用私有构造函数,创建多个实例,还有一种情况就是 序列化和反序列化(通过串行方式))
假定我们假设以上的情况是不多见或者说 在我们的程序当中是不存在不会发生的,那么我们的代码可以有如下实现。
package thread; public class SingletoDemo { public static class InnerSingletoDemo{ public static InnerSingletoDemo instance = new InnerSingletoDemo(); public static InnerSingletoDemo getInstance(){ return InnerSingletoDemo.instance; } } }
通过代码 我们可以观察出,这段代码是通过内部类的形式 来实现单例的。
在这实现中,单例模式通过内部类来维护单例的实例,当SingletoDemo 外部类被加载 时,
其内部类并不会被初始化,故可以确保外部类被载入jvm时,其内部类不会被初始化,当getInstance()方法被调用时,才会加载内部类从而初始化单例对象,
由于实例的创建是在类加载时完成,因此天生对多线程友好,所以可以省去synchronized关键字。
使用内部类实现单例,既可以实现延迟加载,又可以省去synchronized关键字实现同步,是一种比较完善的实现方式。
但是 我们必须注意上面所说的 特殊情况。
发表评论
-
java 多线程操作数据库 及 静态bean注入
2018-01-09 10:47 916package com.robustel.rlink.de ... -
Amino 框架简介
2014-10-17 11:30 1426对数据加锁是实现多线程的一种策略,但是加锁无疑会增加系 ... -
Java 重入锁(ReentrantLock)和内部锁(synchronized)
2014-10-16 15:44 1594ReentrantLock 和 synchronize的 ... -
Java 锁分离
2014-10-16 15:35 1332读写锁思想的延伸就是锁分离。读写锁根据读写操作功能上 ... -
java 高性能运算-- 双端队列
2014-10-15 16:04 1045JDK 1.6中 提供了一种双端队列,简称 Dequ ... -
java 高性能运算--并发队列
2014-10-15 15:33 2489JDK 提供了两套并发队列的实现,一个是以 Conc ... -
Java 同步集合的应用
2014-09-14 23:45 0Java 同步集合的应用 -
java 阻塞队列的应用
2014-09-14 23:44 0java 阻塞队列的应用 -
java 多线程集合
2014-09-14 23:28 0java 多线程集合 -
java Exchanger 线程数据交换
2014-09-14 22:56 0java Exchanger 线程数据交换 -
java CountDownLatch 实例
2014-09-15 18:07 850Java的concurrent包里面的CountDownLat ... -
java 多线程之 CyclicBarrier
2014-09-13 19:25 817CyclicBarrier (周期障碍)类可以帮助同步,它允许 ... -
java CyclicBarrier 循环阻塞
2014-09-12 22:43 435java CyclicBarrier 循环阻塞 -
java 多线程的锁消除
2014-09-12 18:31 1243Java 中使用同步 来保证数据的安全性,但是对于一些明显不会 ... -
java锁的种类以及辨析(一):自旋锁
2014-09-12 16:22 1633Java的多线程安全是基于Lock机制(或者隐式锁synchr ... -
Java锁的种类以及辨析
2014-09-12 15:15 1574锁作为并发共享数据,保证一致性的工具,在java平台有多种实现 ... -
java Semaphore 信号量详解和实例
2014-09-12 11:51 2153生产者线程用于往链表里添加节点,数个工作线程从链表取出节点并处 ... -
4个线程,2个每次加1,两个每次减1
2014-09-01 23:44 850package threadTest; public ... -
线程范围内的共享数据 ThreadLocal 分析与详解
2014-08-30 19:21 810Java 线程范围内的数据共享机制,需要解决的问题是 : 多 ... -
java多线程之Semaphore信号量详解
2014-08-27 13:35 1308原创作品,允许转载,转载时请务必以超链接形式标明文章 原始 ...
相关推荐
在单例模式中,类的构造函数是私有的,防止外部直接创建对象,而是通过静态方法获取该类的唯一实例。单例模式的唯一性通常是在进程范围内,即在同一个进程中,无论何时调用单例类的获取实例方法,都会返回相同的对象...
这种方式在类加载时创建单例,但由于单例创建在静态内部类中,所以只有在调用`getInstance()`时才会加载`SingletonHolder`,实现了延迟初始化,同时也保证了线程安全。 3. **同步枷锁**(Synchronized):在多线程...
2、单例类必须自己创建自己的唯一实例。 3、单例类必须给所有其他对象提供这一实例。 在 Java 中,单例模式的写法有好几种,主要有懒汉式单例、饿汉式单例、登记式单例等。 懒汉式单例是一种常见的单例模式实现...
### 多线程单例模式并发访问 #### 一、多线程基础概念 在讨论多线程单例模式及并发访问之前,我们先来了解一些基本概念。 **进程**和**线程**是计算机科学中的两个核心概念,它们之间的关系紧密而复杂。 - **进程...
在第一次请求时才创建单例对象,但这种方式线程不安全,多线程环境下可能导致创建多个实例。 4. 双重检查锁定(DCL,线程安全): 使用双重检查来确保线程安全,即先检查实例是否已经创建,再进行同步操作创建...
JAVA多线程并发下的单例模式应用 单例模式是设计模式中比较简单的一个,也是非常常见的,但是在多线程并发的环境下使用却是不那么简单了。今天我们将分享一个在开发过程中遇到的单例模式的应用。 单例模式的定义:...
3. Spring框架如何处理并发环境下单例对象的创建和管理? 4. 如何通过反射或序列化破坏单例模式的唯一性,以及如何防御? 5. 如何在保证单例模式的同时,增加可配置性或者实现不同实例的切换? 理解并熟练掌握单例...
单例模式可以确保只有一个角色创建的实例存在,这样所有对角色创建的请求都会导向同一个实例,避免了重复创建和潜在的并发问题。 在Java中,实现单例模式有多种方法,比如懒汉式、饿汉式和双重检查锁定等。懒汉式是...
本文将聚焦于创建型设计模式,特别是单例模式和原型模式,这两种模式在对象的创建方面扮演着重要的角色。 单例模式是一种限制类实例化次数的设计模式,确保在整个应用程序中,一个类只有一个实例存在。这在某些场景...
在Spring框架中,默认情况下是单例模式。如果要产生多例,则需要在配置文件的bean中添加scope="prototype"。这将告诉Spring框架为每个请求创建一个新的对象实例。 三、为什么要用单例多例? 单例模式的优点是能够...
设计模式是软件工程中的一种最佳实践,用于解决在不同场景下重复出现的问题。单例模式是一种常用的设计模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。这样做的目的是为了控制对象的创建,特别...
在设计时,需要考虑类的线程安全性,确保在并发环境下也能保持其单例的特性。 根据提供的文件内容,可以得知,单例模式的实现方式在Java中有很多种,每种都有其使用场景和优缺点。在实际应用中,选择合适的单例模式...
单例模式(Singleton Pattern)作为一种最基本的创建型设计模式,其主要目的是控制一个类的实例化过程,确保在整个应用程序中仅存在一个实例,并且该实例能够被全局访问。这种模式在实际软件开发中有着极其广泛的应用...
在Python编程领域,为了创建高质量的程序,设计模式、并发处理和有效利用程序库是至关重要的元素。本书“Python编程实战 运用设计模式、并发和程序库创建高质量程序”旨在帮助开发者掌握这些核心概念,从而提升代码...
单例模式具有一定的“防并发作用”,由于单例模式只生成一次实例化对象,可以减少系统内存的开销,特别是对于多线程单例,即可以在系统启动时完成实例化,避免对资源的重复占用。 单例模式可以作为程序中的“全局锁...
本Demo——"你想要的Android数据库操作精华(安全、并发、单例等)",旨在深入探讨如何在Android Studio环境下进行高效且安全的数据库操作,包括使用数据库框架、数据库加密、并发控制以及单例模式的应用。...
单例模式的主要目的是限制类的实例化,防止无控制的创建多个对象,尤其是当这个类需要频繁地进行全局共享或者资源管理时。在C++中,通常通过私有构造函数和静态成员函数来实现单例。静态成员函数确保只有一个实例被...