负责加载整个项目的配置信息
技术点:懒汉式单例模式
package com.cici.demo.singleton;
import java.io.IOException;
import java.util.Iterator;
import java.util.Properties;
import java.util.Map.Entry;
import org.apache.log4j.Logger;
public class Configuration {
/*Singleton*/
/*the configuration properties file Path*/
private final static String DEFAULT_CONFIGURATION_FILE_PATH = "/com/cici/demo/migration.properties";
private static Configuration instance = null;
public static Properties props = null;
private final static Logger logger = Logger.getLogger (Configuration.class);
/*Lazy loading*/
//The only way to construct new instance
public static synchronized Configuration getInstance(){
if(instance == null){
props = new Properties();
instance = new Configuration();
try {
props.load(Configuration.class.getResourceAsStream (DEFAULT_CONFIGURATION_FILE_PATH));
} catch (IOException e) {
logger.error(e,e);
}
}
return instance;
}
/*parameter format:xxx=xxx*/
public static synchronized Configuration getInstance(final String[] args){
if(instance==null) {
props = new Properties();
instance = new Configuration();
}
//First load the default config
try{
props.load(Configuration.class.getClass ().getResourceAsStream (DEFAULT_CONFIGURATION_FILE_PATH));
}catch(final IOException e){
logger.error(e,e);
}
// Go through the command line arguments, and override the default config
for (final String arg: args) {
parseArgument (arg);
}
return instance;
}
/*The format of the argument: XX,XX*/
private static void parseArgument(final String argument){
final String[] spligArg = argument.split("=");
if(spligArg.length!=2) {
logger.warn("Command line argument using wrong format"+argument);
}else{
props.put(spligArg[0], spligArg[1]);
}
}
@Override
public String toString(){
String configPart = "";
final Iterator<Entry<Object,Object>> it = props.entrySet().iterator();
while(it.hasNext()){
final Entry<Object,Object> entry = it.next();
configPart+=entry.getKey()+"="+entry.getValue();
if(it.hasNext()){
configPart+=",";
}
}
return "Configurations ["+configPart+"]";
}
/**
* Returns the {@link String} value of a configuration parameter. This is the default value form
* when read from the configuration file.
*
* @param name The name of the value to return
* @return the value from the map
*/
public String getValue (final String name) {
return props.getProperty (name);
}
/**
* Add a value to the configuration map
*
* @param name Name of the new value
* @param value Value to insert
*/
public void putValue (final String name, final Object value) {
props.put (name, value);
}
/**
* Returns a value, converted to {@link Integer}
*
* @param name the name of the configuration value
* @return converted value
*/
public Integer getIntValue (final String name) {
return Integer.parseInt (props.getProperty (name));
}
/**
* Returns a value converted to {@link Long}
*
* @param name the name of the configuration value
* @return converted value
*/
public Long getLongValue (final String name) {
return Long.parseLong (props.getProperty (name));
}
}
要加载的配置文件的路径
/src/com/cici/demo/migration.properties
name=cici
password=cici123love
address=jiangfujiayuan
多线程测试 该单例实例变量
package com.cici.demo.multithread;
import com.cici.demo.singleton.Configuration;
public class TestMuiltyThread {
public static void main(String[] args) {
Th1 t1 = new Th1();
Th2 t2 = new Th2();
Th3 t3 = new Th3();
Th4 t4 = new Th4();
t1.start();
t2.start();
t3.start();
t4.start();
}
}
class Th1 extends Thread{
public void run() {
Configuration con = Configuration.getInstance();
System.out.println(Thread.currentThread().getName()+" "+con.props.size());
}
}
class Th2 extends Thread{
@Override
public void run() {
String[] strs = {"f1=lili","f2=titi","f3=mimi"};
Configuration conn = Configuration.getInstance(strs);
System.out.println(Thread.currentThread().getName()+" "+conn.props.size());
}
}
class Th3 extends Thread{
@Override
public void run() {
String[] strs2 = {"f4=lili","f5=titi","f6=mimi"};
Configuration connn = Configuration.getInstance(strs2);
System.out.println(Thread.currentThread().getName()+" "+connn.props.size());
}
}
class Th4 extends Thread{
@Override
public void run(){
Configuration connn = Configuration.getInstance();
connn.putValue("f7", "gogo");
connn.putValue("f8", "momo");
System.out.println(Thread.currentThread().getName()+" "+connn.props.size());
}
}
输出结果
Thread-0 3
Thread-2 6
Thread-1 9
Thread-3 11
分享到:
相关推荐
9. **设计模式**:Java开发中,熟练运用单例、工厂、观察者、装饰者等设计模式可以提高代码可读性和可维护性。 10. **Java标准库**:包括Collections、Lang、Util等包中的工具类,以及Swing或JavaFX用于构建图形...
12. **设计模式**:讲解常见的设计模式,如工厂模式、单例模式、观察者模式、装饰器模式等,以及如何在实际项目中灵活运用。 通过学习这本“JAVA开发实战经典PPT”,开发者不仅可以掌握Java编程的基本技能,还能...
这份资料全面覆盖了Java高级开发所需的知识点,对于希望在上海拼多多或其他公司从事Java开发的求职者来说,是一份宝贵的复习资源。通过深入学习和理解这些内容,可以显著提高面试成功率,并在实际工作中展现出更高效...
- 创建型模式:单例模式、工厂模式、建造者模式、原型模式等,以及它们在实际项目中的应用。 - 结构型模式:适配器模式、装饰器模式、代理模式、桥接模式、组合模式等。 - 行为型模式:策略模式、观察者模式、...
12. **JVM原理**: 学习Java虚拟机的工作原理,包括类加载机制、内存管理、垃圾收集,有助于优化程序性能。 13. **单元测试**: 使用JUnit或TestNG进行单元测试,确保代码的质量和可靠性。 14. **Maven项目管理**: ...
在Java开发领域,面试是评估求职者技能的重要环节。以下是对给定文件中涉及的Java面试知识点的详细解析: ### 第一章 技巧篇 1. **自我介绍**:面试开始时,良好的自我介绍至关重要。应简洁明了地介绍自己的教育...
- 掌握常见的设计模式,如工厂模式、单例模式、观察者模式等,理解它们在实际项目中的应用。 9. **Spring框架** - **依赖注入**:理解IoC(控制反转)和DI(依赖注入)的概念,以及如何通过XML或注解实现。 - **...
Java后端开发是软件开发领域中的重要组成部分,主要负责服务器端的逻辑处理、数据库交互以及与前端的通信等任务。面试题是评估开发者技能水平的重要工具,以下将根据"java后端开发面试题总结"这一主题,深入探讨相关...
阿里巴巴Java开发规范手册 UMPAY——编码规范 日志规范 异常规范 网络 协议 TCP/IP HTTP hession file HTTPS 负载均衡 容器 JBOSS tomcat resin jetty 容灾 日志框架 开源框架 slf4j 框架实现...
- **设计模式**:了解面试者对面向对象设计原则的熟悉程度,包括单例模式、工厂模式、观察者模式等。 #### 二、Java多线程 - **线程池原理**:解释为何需要线程池,以及线程池的工作原理。 - **线程的生命周期**:...
7. **设计模式**:在Java开发中,设计模式是解决问题的常用策略,如工厂模式、单例模式、装饰器模式和观察者模式等。这些模式提高了代码的可读性和可复用性。 8. **注解(Annotation)**:Java注解是一种元数据,...
接着,《java面试笔试题大汇总 JAVA相关基础知识.doc》是对Java基础知识的全面梳理,可能包括了类加载机制、反射、枚举、内部类、Lambda表达式、注解、泛型等进阶话题。这些都是Java开发中的重要组成部分,理解并能...
- 单例模式、工厂模式、装饰器模式、代理模式等23种设计模式的应用与理解。 - 模式在实际项目中的实践,提高代码可读性和可维护性。 6. **Java高级特性** - Lambda表达式:函数式编程的概念和Java 8中的应用。 ...
- 单例模式、工厂模式、建造者模式、观察者模式等23种经典设计模式。 - 模式在实际项目中的应用和场景分析。 9. **JVM** - 内存模型:堆内存、栈内存、方法区、本地方法栈、程序计数器。 - 垃圾回收:GC原理,...
- **设计模式**:工厂模式、单例模式、观察者模式等常见设计模式在Java中的应用。 - **IO流**:包括字节流和字符流,以及缓冲流、转换流和对象流的使用。 3. **Java网络编程**: - **Socket编程**:创建服务器端...
"Java_技术金矿收集和共享物资资源.zip"这个压缩包文件名暗示了它可能包含一系列与Java学习和开发相关的资源,旨在帮助开发者提升技能和获取最新知识。下面将详细解析其中可能涵盖的知识点,并探讨其重要性和应用。 ...
Java是世界上最流行的编程语言之一,尤其在企业级应用开发领域占据主导地位。为了在激烈的求职竞争中脱颖而出,Java开发者需要对这门语言有深入的理解,并能够应对各种面试挑战。这份"Java面试题大全"涵盖了超过300...
3. 类加载器:理解类加载机制,避免类装载冲突,合理使用自定义类加载器,有助于提升系统性能。 4. JIT编译器:HotSpot JVM中的Just-In-Time编译器能将频繁执行的热点代码编译成机器码,提高运行速度。了解何时启用...
Java高级工程师面试题涵盖了许多关键领域,旨在评估候选人在编程、设计模式、并发处理、内存管理、性能优化、框架理解及...通过深入理解和实践这些内容,可以提升你在Java开发领域的专业素养,增加获得理想职位的机会。
- **设计模式**:工厂模式、单例模式、观察者模式、装饰器模式、策略模式等23种经典设计模式的理解与应用。 - **SOLID原则**:单一职责、开闭原则、里氏替换、接口隔离、依赖倒置原则。 - **构造函数与工厂方法**...