mysql jdbc 单利_java单利模式设计

java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。

Singleton是一种创建型模式,指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点。

核心知识点如下:

(1) 将采用单例设计模式的类的构造方法私有化(采用private修饰)。

(2) 在其内部产生该类的实例化对象,并将其封装成private static类型。

(3) 定义一个静态方法返回该类的实例。

/*** 方法一

* 单例模式的实现:饿汉式,线程安全 但效率比较低

*/

public classSingletonTest {

// 定义一个私有的构造方法

privateSingletonTest() {

}

// 将自身的实例对象设置为一个属性,并加上Static和final修饰符

private static final SingletonTest instance = newSingletonTest();

// 静态方法返回该类的实例

public staticSingletonTest getInstancei() {

returninstance;

}

}

方法一就是传说的中的饿汉模式

优点是:写起来比较简单,而且不存在多线程同步问题,避免了synchronized所造成的性能问题;

缺点是:当类SingletonTest被加载的时候,会初始化static的instance,静态变量被创建并分配内存空间,从这以后,这个static的instance对象便一直占着这段内存(即便你还没有用到这个实例),当类被卸载时,静态变量被摧毁,并释放所占有的内存,因此在某些特定条件下会耗费内存。

/***方法二

* 单例模式的实现:饱汉式,非线程安全

*

*/

public classSingletonTest {

// 定义私有构造方法(防止通过 new SingletonTest()去实例化)

privateSingletonTest() {

}

// 定义一个SingletonTest类型的变量(不初始化,注意这里没有使用final关键字)

private staticSingletonTest instance;

// 定义一个静态的方法(调用时再初始化SingletonTest,但是多线程访问时,可能造成重复初始化问题)

public staticSingletonTest getInstance() {

if (instance == null)

instance = newSingletonTest();

returninstance;

}

}

方法二就是传说的中的饱汉模式

优点是:写起来比较简单,当类SingletonTest被加载的时候,静态变量static的instance未被创建并分配内存空间,当getInstance方法第一次被调用时,初始化instance变量,并分配内存,因此在某些特定条件下会节约了内存;

缺点是:并发环境下很可能出现多个SingletonTest实例。

/***方法三

* 单例模式的实现:饱汉式,线程安全简单实现

*

*/

public classSingletonTest {

//定义私有构造方法(防止通过 new SingletonTest()去实例化)

privateSingletonTest() {

}

//定义一个SingletonTest类型的变量(不初始化,注意这里没有使用final关键字)

private staticSingletonTest instance;

//定义一个静态的方法(调用时再初始化SingletonTest,使用synchronized 避免多线程访问时,可能造成重的复初始化问题)

public static synchronizedSingletonTest getInstance() {

if (instance == null)

instance = newSingletonTest();

returninstance;

}

}

方法三为方法二的简单优化

优点是:使用synchronized关键字避免多线程访问时,出现多个SingletonTest实例。

缺点是:同步方法频繁调用时,效率略低。

/**

* 方法四

* 单例模式最优方案

* 线程安全 并且效率高

*

*/

public class SingletonTest {

// 定义一个私有构造方法

private SingletonTest() {

}

//定义一个静态私有变量(不初始化,不使用final关键字,使用volatile保证了多线程访问时instance变量的可见性,避免了instance初始化时其他变量属性还没赋值完时,被另外线程调用)

private static volatile SingletonTest instance;

//定义一个共有的静态方法,返回该类型实例

public static SingletonTest getIstance() {

// 对象实例化时与否判断(不使用同步代码块,instance不等于null时,直接返回对象,提高运行效率)

if (instance == null) {

//同步代码块(对象未初始化时,使用同步代码块,保证多线程访问时对象在第一次创建后,不再重复被创建)

synchronized (SingletonTest.class) {

//未初始化,则初始instance变量

if (instance == null) {

instance = new SingletonTest();

}

}

}

return instance;

}

}

方法四为单例模式的最佳实现。内存占用地,效率高,线程安全,多线程操作原子性。

(事实上,可以通过Java反射机制来实例化private类型的构造方法,此时基本上会使所有的Java单例实现失效。本帖不讨论反射情况下问题,默认无反射,也是常见的面试已经应用场景)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/526337.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vb 读取mysql所有表名_vb怎么列举出一个mdb数据库里面所有表名?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Private Sub Command1_Click()Dim conn As New ADODB.ConnectionDim rs As New ADODB.Recordset打开指定的服务器sql "ProviderSQLOLEDB.1;Persist Security InfoFalse;User IDfood;Password123456;Data Source192.168.1.251…

mysql行级锁升级_mysql innodb 行级锁升级

创建数据表test,表定义如下所示:CREATE TABLE test (id int(11) NOT NULL AUTO_INCREMENT,name varchar(20) NOT NULL,PRIMARY KEY (id),KEY idx_name (name)) ENGINEInnoDB AUTO_INCREMENT1 DEFAULT CHARSETlatin1;创建测试数据集,插入SQL语…

mysql触发器可以使用正则表达式,是否可以使用正则表达式在MySQL中强制执行数据检查...

Suppose I have an attribute called phone number and I would like to enforce certain validity on the entries to this field. Can I use regular expression for this purpose, since Regular Expression is very flexible at defining constraints.解决方案Yes, you can…

c 调用mysql密码为空_C语言连MySQL - osc_srnunz15的个人空间 - OSCHINA - 中文开源技术交流社区...

连接例程用C语言连接MySQL数据库包含两个步骤“初始化一个连接句柄结构;实际进行连接。初始化连接句柄#includeMYSQL *mysql_init(MYSQL *);通常传递NULL给这个例程,它会返回一个指向新分配的连接句柄结构的指针。如果传递一个已有的结构,它将…

mysql怎么分组查询所有数据库_Mysql-4 分组查询与子查询

1、查询结果的分组操作a、分组允许把数据分为多个组,以便能对每个组进行聚集计算b、分组是在select语句的group by 子句中建立的注意:group by 只是创建分组,但并不保证分组里面的数据的排列顺序,需要使用order by 子句对分组里面…

mysql 多列union_Mysql联合查询UNION和UNION ALL的使用介绍

一、UNION和UNION ALL的作用和语法UNION 用于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复行。UNION 内部的 SELECT 语句必须拥有相同数量的列,列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同.SQL UNION…

mysql导数据出指定数量_mysql导出指定数据或部份数据的方法

这个时候mysqldump可能就不大好使了,使用下面的方法则可以解决这个问题。方法一、insert和select结合使用1、新建一个表,比如new-table,包含所要导出的字段的名称,比如a,b,c2、使用insert into new-table (a,b,c) select a,b,c fr…

mysql update upper_MySQL数据处理函数upper、abs、date

1. 数据处理函数文本处理函数upper()转换大写函数SQL> select vend_name, upper(vend_name) as vend_name_upcase from vendors order by vend_name;soundex()发音类似函数SQL> select cust_name, cust_contact from customers where cust_contact Y. Lie;SQL> selec…

mysql与django交互_django与mysql交互

查看ubuntu已安装的所有软件:查看软件安装的路径查看开机启动的软件,需要额外安装插件:安装mysql:django setting配置:在model模块中添加如下建表语句:vi app/models.pymodel模块在app中,其中定…

深度系统如何安装mysql_deepin 安装mysql apache

# 如果MYSQL安装成功,就会有my-medium.cnfcp /usr/local/src/mysql-5.5.17/support-files/my-medium.cnf/etc/my.cnf# 设置权限chmod x /usr/local/mysqlchown -R mysql:mysql /usr/local/mysql# 配置开机自启动cp support-files/mysql.server /etc/init.d/mysqldch…

自动清理mysql的lock进程的脚本_自动清理MySQL的Lock进程的脚本

自动清理MySQL的Lock进程的脚本作者:小涵 | 来源:互联网 | 2018-07-13 21:01阅读: 915最近数据库服务器在某一时段进程数忽然暴增,导致数据库服务器死掉,根据日志查询,是由于Mysql大量Lock进程造成服务器进程数过高导致…

java 获取类方法_Java之反射机制三:获取类的方法

一.实体类BigDog.javapackage reflex;public class BigDog extends Dog {private Integer age;public String name;public BigDog(){}private void getDog(){}private BigDog(Integer age, String name) {this.age age;this.name name;}public String getName() {return name…

java 判断客户端_javaweb服务端判断客户端使用的是手机还是电脑访问

public class ToolCheckAgentIsMobile {private final static String[] agent { "Android", "iPhone", "iPod", "iPad", "Windows Phone", "MQQBrowser" };/*** 判断User-Agent 是不是来自于手机** param ua* re…

java thread 多线程_java用Thread方式创建多线程

进程:一个正在执行的程序,每一个进程都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元。线程:进程中一个独立的控制单元。线程控制着进程的执行。一个进程中至少有一个线程。java VM中至少有一个线程负责jav…

微信红包接口 java_【java微信开发】红包接口调用

//import相关类import java.io.FileInputStream;import java.security.KeyStore;import java.util.Date;import java.util.List;import java.util.Map;import javax.net.ssl.KeyManagerFactory;import javax.net.ssl.SSLContext;import javax.net.ssl.SSLSocketFactory;import …

java多个类调用_JAVA问题总结之15-多个类之间的调用

JAVA问题总结之15-多个类之间的调用:代码:package java3;public class test1 {public static void main(String[] args){Pretimive t new Pretimive();for (int i0;iSystem.out.println(t.b[i]);}System.out.print("\n");t.b[0]true;t.b[2]tr…

java语言50到100之间素数和_用JAVA语言编写一程序,求100以内的所有素数

满意答案fdewj5902017.02.13采纳率&#xff1a;40% 等级&#xff1a;9已帮助&#xff1a;316人12345678910111213141516171819public static void main(String[] args) { for (int i 2; i < 100; i) { int temp (int) Math.sqrt(i); …

java矩阵面积_Java基础 矩阵面积

提供 数据结构与算法题目 的平台是LintCode&#xff0c;参考链接是&#xff1a;http://www.lintcode.com/zh-cn/问题描述&#xff1a;参考代码&#xff1a;public class Rectangle {/** Define two public attributes width and height of type int.*/// write your code herep…

java 字母冒泡排序_java实现冒泡排序

冒泡排序冒泡排序(Bubble Sort)&#xff0c;是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的元素列&#xff0c;依次比较两个相邻的元素&#xff0c;如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元…

java修饰符的访问权限_java项目中修饰符的访问权限有哪些

java项目中修饰符的访问权限有哪些发布时间&#xff1a;2020-11-17 15:05:33来源&#xff1a;亿速云阅读&#xff1a;67作者&#xff1a;Leah这篇文章给大家介绍java项目中修饰符的访问权限有哪些&#xff0c;内容非常详细&#xff0c;感兴趣的小伙伴们可以参考借鉴&#xff0c…