当前位置:编程学习 > JAVA >>

java 单例加锁方法的讨论

java 单例加锁方法:

ScheduleEngine是个单例类,在获得实例的方法getinstance中,两次判断其是否为空,有利于多线程的并发操作。

使得实例化时,只在第一次加锁,这样效率会有提高。

 

Java代码 
class ScheduleEngine{  
      
        private static Lock instanceLock=new ReentrantLock();  
          
        private ScheduleEngine() {  
            setproperties;  
        }  
          
        public static ScheduleEngine getInstance(int temphandlerType) {  
            if(null==engine) {  
                instanceLock.lock();  
                try 
                {  
                if(null==engine)  
                {  
                handlerType=temphandlerType;  
                engine=new ScheduleEngine(temphandlerType);  
                }  
          
                }  
                finally 
                {  
                instanceLock.unlock();  
                }  
            }  
            return engine;  
            }   
    } 
 

初始实例化 单例c3p0对象的方法,常用的是

 

Java代码 
public final class ConnectionManager {  
 
    private static ConnectionManager instance;  
    private static ComboPooledDataSource cpds;  
 
    private static String c3p0Properties;  
 
    /** 
     * 从数据库连接池取连接 
     * @throws Exception 
     */ 
    private ConnectionManager() throws Exception {  
        Properties p = new Properties();  
        c3p0Properties = System.getProperty("user.dir") +  
                "/mom_project_config/database.properties";  
//      p.load(this.getClass().getClassLoader().getResourceAsStream(c3p0Properties));  
        p.load(new BufferedInputStream(new FileInputStream(c3p0Properties)));  
//      String url = p.getProperty("url") + p.getProperty("database");  
        String url = p.getProperty("url") + p.getProperty("database")+"?useUnicode=true&characterEncoding=UTF-8";  
        cpds = new ComboPooledDataSource();  
        cpds.setDriverClass(p.getProperty("driverclass"));  
        cpds.setJdbcUrl(url);  
        cpds.setUser(p.getProperty("user"));  
        cpds.setPassword(p.getProperty("password"));  
        // 当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 acquireIncrement  
        cpds.setAcquireIncrement(Integer.valueOf(p  
                .getProperty("acquireincrement")));  
        // 定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 acquireRetryAttempts  
        cpds.setAcquireRetryAttempts(Integer.valueOf(p  
                .getProperty("acquireretryattempts")));  
        // 两次连接中间隔时间,单位毫秒。Default: 1000 acquireRetryDelay  
        cpds.setAcquireRetryDelay(Integer.valueOf(p  
                .getProperty("acquireretrydelay")));  
        // 自动提交事务;连接关闭时默认将所有未提交的操作回滚。Default: false autoCommitOnClose  
        cpds.setAutoCommitOnClose(Boolean.valueOf(p  
                .getProperty("autocommitonclose")));  
        // 当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出SQLException,  
        // 如设为0则无限期等待.单位毫秒,默认为0  
        cpds.setCheckoutTimeout(Integer.valueOf(p  
                .getProperty("checkouttimeout")));  
        // 每多少秒检查所有连接池中的空闲连接。默认为0表示不检查。Default: 0 idleConnectionTestPeriod  
        cpds.setIdleConnectionTestPeriod(Integer.valueOf(p  
                .getProperty("idleconnectiontestperiod")));  
        // 最大空闲时间,25000秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 maxIdleTime  
        cpds.setMaxIdleTime(Integer.valueOf(p.getProperty("maxidletime"

补充:软件开发 , Java ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,