Java设计模式 -- Singleton模式

Java中的模块(Module)入门介绍 在Java 9版本中Java 语言引入了一个非常重要的概念:模块(module)。module引入了Java代码分组的另一个级别。每个module都包含许多子package(包)。模块是一组密切相关的包和资源以及一个新的模块描述符文件。Java文件是按照Java包的结构组织起来的,Java中的包通常包含相关的类,映射的实体概念是目录(directory),Java文件对应的目录结构层次要和包的结构层次一致。编译后的.class文件也需要按照包结构存放。 阅读详情

我们先来看看网上比较流行的几种单例模式:

非线程安全

public class Singleton {  
    private Singleton() {}  
    private static Singleton single=null;  

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

单边加锁

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

双边加锁

public static Singleton getInstance() {  
    if (singleton == null) {    
        synchronized (Singleton.class) {    
           if (singleton == null) {    
              singleton = new Singleton();   
           }    
        }    
    }    
    return singleton;   
}

嵌套类实现

public class Singleton {    
    private static class LazyHolder {    
       private static final Singleton INSTANCE = new Singleton();    
    }  

    private Singleton (){
    }    

    public static final Singleton getInstance() {    
       return LazyHolder.INSTANCE;    
    }    
}  

有没有发现这些流行的代码都没有涉及带有参数的单例模式,如果单例需要传入参数,该如何实现,如果实现不能再套用上面的代码,那么问题来了,该如何处理?
我们先假设,直接把参数按照原先的代码样式传过来,如下所示

带有参数的单例实现

public static Singleton getInstance(final Object object) {  
    if (singleton == null) {    
        synchronized (Singleton.class) {    
           if (singleton == null) {    
              singleton = new Singleton(object);   
           }    
        }    
    }    
    return singleton;   
}

这里给出了双边加锁传入参数的例子,单边加锁和嵌套类实现道理相同。虽然代码轻易实现了,但是先别高兴,如果仔细看看代码,你会发现,如果传入不同的参数是不是可能导致单例不再是同一个实例了呢?即使能保证单例,但是语义上已经完全不符合单例的要求,所以该换个更符合实际项目的单例模式,这里仅仅给出双边加锁的线程安全单例代码如下

推荐单例实现

public class DeviceInfoManager {
    private static DeviceInfoManager DEVICE_INFO_MANAGER = null;
    private DeviceInfoManager(final Context context) {
        //TODO
    }

    public static void createInstance(final Context context) {
        if (DEVICE_INFO_MANAGER == null) {
            synchronized (DeviceInfoManager.class) {
                if (DEVICE_INFO_MANAGER == null) {
                    DEVICE_INFO_MANAGER = new DeviceInfoManager(context);
                }
            }
        }
    }

    public static DeviceInfoManager getInstance() {
        if (DEVICE_INFO_MANAGER == null) {
            throw new NullPointerException("getInstance() is Null, please call DeviceInfoManager.createInstance(context) first!");
        }

        return DEVICE_INFO_MANAGER;
    }
}
保姆级教程:用DaVinci Configurator & Developer从零搭建AUTOSAR OS(TC2xx三核实战) 本文提供了一份详细的AUTOSAR OS配置指南,使用DaVinci Configurator和Developer工具从零开始搭建Infineon TC2xx三核系统。涵盖多核配置协同逻辑、版本兼容性陷阱及验证错误的解决方案,帮助开发者在3小时内构建可运行的多核OS框架。 阅读详情

相关推荐

ArcGIS拓扑检查实战:5分钟搞定面重叠与缝隙问题(附详细截图)

本文详细介绍了如何使用ArcGIS进行拓扑检查,快速解决面重叠与缝隙问题。通过搭建拓扑检查环境、配置拓扑规则、五步闪电修复法及批量处理技巧,帮助用户高效完成数据修正,提升GIS数据质量。特别适合地籍管理、规划红线等场景应用。

z4a5b6的博客 741

Java的模块(module)

Java的模块(module)

听海边涛声 3870

TMC5130/TMC5160步进电机驱动芯片深度解析与工程实践

步进电机驱动芯片是精密运动控制系统的物理执行核心,其性能直接决定定位精度、运行噪声与系统鲁棒性。基于电流闭环控制与电压前馈调制的混合驱动原理,现代智能驱动芯片如TMC51X0系列实现了微步插补、堵转检测和片上运动规划等关键技术突破。这类芯片通过SPI寄存器级配置实现StealthChop静音驱动与SpreadCycle高动态响应模式的无缝切换,在3D打印、CNC、机器人关节等场景中显著提升能效比与控制带宽。本文围绕TMC5130与TMC5160的硬件架构差异、寄存器操作时序、驱动模式物理机制及FreeRTO

weixin_35797963的博客 408

Java9新特性——module模块系统

为什么80%的码农都做不了架构师?>>> ...

weixin_34336292的博客 1910

CUDA编译踩坑实录:如何正确设置-gencode参数适配你的GPU算力

本文深入解析CUDA编译中-gencode参数的核心原理与实战配置,帮助开发者解决常见的'Unsupported gpu architecture'错误。通过厘清虚拟架构与真实架构的区别,并提供多版本兼容的CMake配置方案,确保编译出的代码能精准适配不同GPU算力,兼顾性能与广泛兼容性。

weixin_28829903的博客 338

DDR March系列算法整理

一

不吃鱼的猫的博客 1万+

在IDEA中创建Java 9 modules(模块)的Hello World

IntelliJ IDEA 2017.1 支持Java9的模块化特性 (Project Jigsaw)。 在此版本,模块文件中还支持基于特定名称与关键字的自动补全功能 code completion, 并且你可以快速斧正你项目中的模块化代码。So,那就让我们来一探究竟什么是模块化工程。首先,我们创建一个普通的模块工程 IntelliJ IDEA module 其中包含了改变世界的伟大的 “Hello

Lovnx 1万+

STM32F103C8T6+TB6612驱动直流电机全攻略(附PWM调速代码)

本文提供了一份基于STM32F103C8T6微控制器和TB6612驱动模块的直流电机驱动完整解决方案。详细解析了硬件连接、STM32CubeMX配置、HAL库驱动代码编写,并附带了PWM调速代码实现。内容涵盖从基础原理到实战调试的全过程,旨在帮助开发者快速构建稳定、可精准调速的电机控制系统,适用于智能车、机器人等嵌入式项目。

weixin_29181861的博客 586

singleton设计模式_Java Singleton设计模式

singleton设计模式 它是Java中最简单的设计模式之一。 如果有人问我哪种设计模式好,那么我会很自豪地说Singleton。 但是,当他们深入询问单身人士的概念时,我感到很困惑。 真的单身是那么困难吗? 确实不是,但是它有许多场景需要我们理解(尤其是初学者)。 定义: 在所有情况下,该类仅应允许一个实例,并且我们应提供对该实例的全局访问点。 定义就像1,2,...

最佳 Java 编程 171

深入理解 ABAP 中的 Fast Data Access:从 @itab 到 FOR ALL ENTRIES 的性能关键路径

ABAP性能优化的关键在于理解Fast Data Access(FDA)机制,它连接了应用服务器的内表与数据库运算。FDA允许将内表数据推送到数据库进行筛选、聚合等操作,是SELECT...FROM@itab语法的基础。开发者需注意:1)该语法可能在内置引擎或数据库执行;2)仅当SQL能力超出ABAP范围时才建议使用;3)需通过CL_ABAP_DBFEATURES检查数据库支持情况。合理使用FDA可优化批量数据处理,但滥用可能导致性能下降。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1269

C#实现将DataGridView中数据导出到Excel (附完整源码)

C#实现将DataGridView中数据导出到Excel (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1589

Java类库看设计模式Command,AbstractFactory,Singleton

http://www.ibm.com/developerworks/cn/java/l-jdkdp/part2/   简介:  在 上一部分的内容中,我们讲到什么是模式,什么是设计模式,以及对一个设计模式Observer的详细阐叙。相信大家对于模式的概念应该是比较的理解了。这 部分及以后的内容,将会步入正题,从Java类库的分析入手,来阐叙设计模式是如何应用到一个完美的设计中的。实际上,...

sqcwfiu 184

高通平台开发系列讲解(USB篇)MBIM协议详解

📢本文主要介绍高通平台USB网卡MBIM协议。

内核笔记 5438

java设计模式:Singleton模式

Singleton模式是java中用到最多的设计模式。用于控制的个数,防止多余的实例化及修改。在仅有一个对象存在时,操作很有效。 1、构造函数私有化,其它类不能实例化对象 2、引用私有化,没有其它的修改 3、公有的静态方法唯一获取对象 第一种实现: class AmericanPresident { private static final AmericanPresident theP

多看多听多总结 697

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

设计模式 - Singleton in Java

遇到任何一件事情都可以使用三个单词来解决。 what / Why / How 什么是Singleton? 它一种设计模式,在这种模式下我们只能够对某个类进行实例化一次 为什么要使用Singleton? 当一个对象需要对整个系统进行操作或者监控的时候 例如 任务管理器 或者 当系统中只存在某类一个对象时,系统的效率最高等。 怎么样实现singleton in jav

YtdxYHZ的专栏 845

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

关于JAVA设计模式中的Singleton

关于JAVA设计模式中的Singleton  设计模式是很以前学的东西了,那时候的代码量少的可怜,所以对其之道理是只知其表,不明所里!最近有底下的学弟问我关于Singleton的问题!在陈述问题之前,我们先写出来singleton的两种常见表现形式! public class SingletonDemo {private static final SingletonDemo

SANBENREN的专栏 709

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

在Java中应用设计模式--Singleton

本文介绍了设计模式中 Singleton 的基本概念,对其功能和用途进行了简单的分析,列出了通常实现 Singleton 的几种方法,并给出了详细的Java 代码.  基本概念  Singleton 是一种创建性模型,它用来确保只产生一个实例,并提供一个访问它的全局访问点.对一些类来说,保证只有一个实例是很重要的,比如有的时候,数据库连接或 Socket 连接要受到一定的限制,必须保持同一时间只能

Herr Apfel的专栏 2636

Java 设计模式:Singleton 模式

Java 设计模式:Singleton 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 代码如下: class singleton { private singleton() {}//构造函数必须是私有的,防止外部调用,生成对象 private static final singleton aobject = new singleton();//该类的唯一对象

1059

Java设计模式之Singleton

使用Java才一年多的时间,虽然这期间也用Java写过几个Android的AP,但是对于高阶部分还是接触的较少。 今天有看到Singleton的Java设计模式,以前没有太专注于这个方面,于是就想把它搞懂。 Singleton模式说白了就是保证在Java应用程序中,一个Class只能有一个实例存在。 这个在我们日常编程中实例还是挺多的,比方说独享的资源,一台机器无论是在什么操作系统上,网...

allenpettle的专栏 113

Java 设计模式 Singleton 单例 模式

Java 设计模式 Singleton 单例 模式 Singleton模式用于只生产一个实例。 涉及到的角色 Singleton:负责生产一个实例,角色中有一个总是返回唯一实例的static方法。 /** * 单例 * @author 托马斯小火车喷雾又喷烟 * */ public class Singleton { private static Singleton instance = new Singleton(); private Singleton() { Sy.

5万+

java设计模式之Singleton

 设计模式之Singleton(单态)板桥里人 http://www.jdon.com 2002/05/07定义:Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。 如何使用?第一种形式: 

natee的专栏 4765

创建型设计模式实战:从Singleton到Builder的Java实现精髓

创建型设计模式实战:从Singleton到Builder的Java实现精髓 【免费下载链接】java-design-patterns Java 中实现的设计模式。 项目地址: https://gitcode.com/GitHub_...

gitblog_00492的博客 940

Java设计模式之Singleton模式

转载:http://www.svn8.com/java/sjms/20100320/26911.html Java设计模式之Singleton模式   Java Singleton 模式用来保证在运行的应用程序中,一个Class只是实例化一次,也就是只有一个相应的对象存在。在 web 程序中我们会用一个核心的分配功能的Servlet程序,在这里我们就可以运用这种设计模式了。   一般Sin...

iteye_18761的博客 176

Java Singleton设计模式

它是Java中最简单的设计模式之一。 如果有人问我哪种设计模式好,那么我会很自豪地说Singleton。 但是,当他们深入询问单身人士的概念时,我感到很困惑。 真的单身是那么困难吗? 确实不是,但是它有许多我们需要了解的场景(尤其是初学者)。 定义: 在所有情况下,该类仅应允许一个实例,并且我们应提供对该实例的全局访问点。 定义就像1,2,3和A,B,C,D一样简...

最佳 Java 编程 244
上一篇: Fragment Commit 异常处理
下一篇: Android 热更新——非侵入AOP框架
linroidh
博客等级 码龄16年 15粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值