`
lee123lee123
  • 浏览: 9503 次
社区版块
存档分类
最新评论
收藏列表
标题 标签 来源
servlet生成验证码
package com.mweb.user.servlet;
 
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
 
import javax.imageio.ImageIO;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
/**
 * 生成图形验证码的Servlet
 */
public class ImageCodeMakerServlet extends HttpServlet
{
 
    @Override
    public void init(ServletConfig config) throws ServletException
    {
        // TODO Auto-generated method stub
        super.init(config);
    }
 
    /**
     *
     */
    private static final long serialVersionUID = -8924942016876830055L;
 
    public void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException
    {
        doPost(req, resp);
    }
 
    /**
     * @see javax.servlet.http.HttpServlet#void
     *      (javax.servlet.http.HttpServletRequest,
     *      javax.servlet.http.HttpServletResponse)
     */
    public void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException
    {
 
        // 首先设置页面不缓存
        resp.setHeader("Pragma", "No-cache");
        resp.setHeader("Cache-Control", "no-cache");
        resp.setDateHeader("Expires", 0);
 
        // 定义图片的宽度和高度
        int width = 90, height = 40;
        // 创建一个图像对象
        BufferedImage image = new BufferedImage(width, height,
                BufferedImage.TYPE_INT_RGB);
        // 得到图像的环境对象
        Graphics g = image.createGraphics();
 
        Random random = new Random();
        // 用随机颜色填充图像背景
        g.setColor(getRandColor(180, 250));
        g.fillRect(0, 0, width, height);
        for (int i = 0; i < 5; i++)
        {
            g.setColor(getRandColor(50, 100));
            int x = random.nextInt(width);
            int y = random.nextInt(height);
            g.drawOval(x, y, 4, 4);
        }
        // 设置字体,下面准备画随机数
        g.setFont(new Font("", Font.PLAIN, 40));
        // 随机数字符串
        String sRand = "";
        for (int i = 0; i < 4; i++)
        {
            // 生成四个数字字符
            String rand = String.valueOf(random.nextInt(10));
            sRand += rand;
            // 生成随机颜色
            g.setColor(new Color(20 + random.nextInt(80), 20 + random
                    .nextInt(100), 20 + random.nextInt(90)));
            // 将随机数字画在图像上
            g.drawString(rand, (17 + random.nextInt(3)) * i + 8, 34);
 
            // 生成干扰线
            for (int k = 0; k < 12; k++)
            {
                int x = random.nextInt(width);
                int y = random.nextInt(height);
                int xl = random.nextInt(9);
                int yl = random.nextInt(9);
                g.drawLine(x, y, x + xl, y + yl);
            }
        }
 
        // 将生成的随机数字字符串写入Session
        req.getSession().setAttribute("randcode", sRand);
        // 使图像生效
        g.dispose();
        // 输出图像到页面
        ImageIO.write(image, "JPEG", resp.getOutputStream());
    }
 
    /**
     * 产生一个随机的颜色
     *
     * @param fc
     *            颜色分量最小值
     * @param bc
     *            颜色分量最大值
     * @return
     */
    public Color getRandColor(int fc, int bc)
    {
        Random random = new Random();
        if (fc > 255)
        {
            fc = 255;
        }
        if (bc > 255)
        {
            bc = 255;
        }
        int r = fc + random.nextInt(bc - fc);
        int g = fc + random.nextInt(bc - fc);
        int b = fc + random.nextInt(bc - fc);
        return new Color(r, g, b);
    }
}
wsdl2java:参数解释
wsdl2java:参数解释
 
wsdl2java 用于根据WSDL生成相应的服务端和客户端代码的生成工具。
命令行格式为:WSDL2Java [options] -uri <url or path> : A url or path to a WSDL
 
其中常用的options具体如下:
-o <path>            : 指定生成代码的输出路径
-a                   :   生成异步模式的代码
-s                   :   生成同步模式的代码
-p <pkg>             :   指定代码的package名称
-l <languange>       : 使用的语言(Java/C) 默认是java
-t                   : 为代码生成测试用例
-ss                  :   生成服务端代码 默认不生成
-sd                  :   生成服务描述文件 services.xml,仅与-ss一同使用
-d <databinding>     : 指定databingding,例如,adb,xmlbean,jibx,jaxme and jaxbri
-g                   : 生成服务端和客户端的代码
-pn <port_name>      : 当WSDL中有多个port时,指定其中一个port
-sn <serv_name>      : 选择WSDL中的一个service
-u                   : 展开data-binding的类
-r <path>            : 为代码生成指定一个repository
-ssi                 :   为服务端实现代码生成接口类
-S                   : 为生成的源码指定存储路径
-R                   :   为生成的resources指定存储路径
--noBuildXML         :   输出中不生成build.xml文件
--noWSDL             :   在resources目录中不生成WSDL文件
--noMessageReceiver  : 不生成MessageReceiver类
 
-scn                 : 用已有的代码代替skeletons
dom解析
/**
 * @param args
 */
public static void main(String[] args) {
    // try {
    // HelloStub stub = new HelloStub();
    // GetUser user = new GetUser();
    // user.setId("22");
    // stub.getUser(user);
    // } catch (AxisFault e) {
    // // TODO Auto-generated catch block
    // e.printStackTrace();
    // } catch (RemoteException e) {
    // // TODO Auto-generated catch block
    // e.printStackTrace();
    // }
    String xml = "<?xml version='1.0' encoding='utf-8'?>"
            + "<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">"
            + "<soapenv:Body>"
            + "<ns:getUserResponse xmlns:ns="http://test.lvxh.com">"
            + " <ns:return xmlns:ax21="http://test.lvxh.com/xsd""
            + "     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ax21:Result">"
            + "     <ax21:code>0</ax21:code>"
            + "     <ax21:list>hello</ax21:list>" + "       </ns:return>"
            + "</ns:getUserResponse>" + "</soapenv:Body>"
            + "</soapenv:Envelope>";
    Map<String, List<Node>> map = new HashMap<String, List<Node>>();
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    try {
        DocumentBuilder db = dbf.newDocumentBuilder();
        ByteArrayInputStream is = new ByteArrayInputStream(xml.getBytes());
        Document document = db.parse(is);
        NodeList node = document.getChildNodes();
        Test test = new Test();
        for (int i = 0; i < node.getLength(); i++) {
             
            Node a = node.item(i);
            if(a instanceof DeferredElementImpl)
            {
                test.pars(a, map);
            }
        }
    } catch (ParserConfigurationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SAXException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    //System.out.println(map.get("code").get(0).getTextContent());
 
}
 
public void pars(Node node, Map<String, List<Node>> map)
{
    NodeList nodeList = node.getChildNodes();
    if(node instanceof DeferredElementImpl)
    {
        String name = node.getNodeName().split(":")[1];
        if (map.get(name) != null) {
            map.get(name).add(node);
             
        } else {
            List<Node> l = new ArrayList<Node>();
            l.add(node);
            map.put(name, l);
        }
    }
    if (nodeList == null || nodeList.getLength() == 0) {
        return;
    } else {
        for (int i = 0; i < nodeList.getLength(); i++) {
            Node n = nodeList.item(i);
            if(n instanceof DeferredElementImpl)
            {
            pars(n, map);
            }
        }
    }
}
后台发送发生http请求
发生http请求
        URLConnection urlCon = null;
        OutputStreamWriter out = null;
        BufferedReader reader = null;
        InputStreamReader ir = null;
        InputStream input = null;
        OutputStream raw = null;
        OutputStream buf = null;
        String xmlString = "";
 
        try
        {
            urlCon = new URL(urlStr).openConnection();
 
            urlCon.setRequestProperty("Content-Type", "text/xml; charset=UTF-8");
            urlCon.setRequestProperty("Accept",
                    "application/x-www-form-urlencoded");
            urlCon.setRequestProperty("version", "100");
            urlCon.setRequestProperty("Keep-Alive", "300");
            urlCon.setRequestProperty("Content-Type",
                    "application/x-www-form-urlencoded");
            urlCon.setDoOutput(true);
            urlCon.setDoInput(true);
            urlCon.setReadTimeout(NUM_SIXTY_THOUSAND);
 
            raw = urlCon.getOutputStream();
            buf = new BufferedOutputStream(raw);
            out = new OutputStreamWriter(buf, "UTF-8");
 
            out.write(xmlMsg);
            out.flush();
            input = urlCon.getInputStream();
            ir = new InputStreamReader(input, "UTF-8");
            reader = new BufferedReader(ir);
            String line = null;
            StringBuffer xmlStr = new StringBuffer();
            while ((line = reader.readLine()) != null)
            {
                xmlStr.append(line);
            }
 
            xmlString = xmlStr.toString().trim();
        }
     
        return xmlString;
ssm搭建流程
ssm框架搭建流程(1)
1.在myeclipse创建java web工程“ssm”。
2.将如下jar包复制到当前工程的WebRootWEB-INFlib目录下
     asm-3.3.1.jar
     asm-commons-3.3.jar
     asm-tree-3.3.jar
     aspectjlib.jar
     aspectjrt.jar
     aspectjweaver.jar
     cglib-2.2.2.jar
     com.springsource.org.aopalliance-1.0.0.jar
     com.springsource.org.apache.commons.codec-1.3.0.jar
     commons-dbcp.jar
     commons-fileupload-1.3.jar
     commons-io-2.0.1.jar
     commons-lang3-3.1.jar
     commons-logging-1.1.3.jar
     commons-pool.jar
     freemarker-2.3.19.jar
     javaee.jar
     javassist-3.17.1-GA.jar
     jsf-api.jar
     jsf-impl.jar
     jstl-1.2.jar
     junit-4.4.jar
     log4j-1.2.17.jar
     mybatis-3.2.2.jar
     mybatis-spring-1.2.0.jar
     ognl-3.0.6.jar
     org.springframework.web.servlet-3.0.5.RELEASE.jar
     slf4j-api-1.7.5.jar
     slf4j-log4j12-1.7.5.jar
     spring-aop-3.2.2.jar
     spring-aspects-3.2.2.jar
     spring-beans-3.2.2.jar
     spring-build-src-3.2.2.jar
     spring-context-3.2.2.jar
     spring-context-support-3.2.2.jar
     spring-core-3.2.2.jar
     spring-expression-3.2.2.jar
     spring-instrument-3.2.2.jar
     spring-instrument-tomcat-3.2.2.jar
     spring-jdbc-3.2.2.jar
     spring-jms-3.2.2.jar
     spring-orm-3.2.2.jar
     spring-oxm-3.2.2.jar
     spring-security-core-2.0.1.jar
     spring-struts-3.2.2.jar
     spring-test-3.2.2.jar
     spring-tx-3.2.2.jar
     spring-web-3.2.2.jar
     spring-webmvc-3.2.2.jar
     spring-webmvc-portlet-3.2.2.jar
     struts2-core-2.3.15.1.jar
     xwork-core-2.3.15.1.jar
3.在工程目录下创建conf文件夹。
4.在conf文件夹下创建spring配置文件。
  applicationContext.xml //spring配置文件
  globalMessages_en_US.properties //国际化资源文件
  globalMessages_zh_CN.properties
  log4j.properties //日志配置文件
  struts.xml //struts2配置文件
5.在工程目录WebRootWEB-INF下创建 springmvc配置文件
  example-servlet.xml



ssm框架搭建流程(2)
6.配置 applicationContext.xml文件说明:
   <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
 
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver">
        </property>
        <property name="url" value="jdbc:oracle:thin:@10.137.26.50:1521:INOMC">
        </property>
        <property name="username" value="portal"></property>
        <property name="password" value="portal"></property>
        <property name="maxActive" value="100"></property>
        <property name="maxIdle" value="500"></property>
        <property name="maxWait" value="-1"></property>
    </bean>
 
    <!-- mybatis SQLSessionFactory -->
    <!-- 第二测参数是自动扫描mapping目录,省去Configuration.XML手工配置 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="mapperLocations" value="classpath:com/mweb/mybatis/mapping/*.xml" />
    </bean>
 
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 此处的value可以配置多个 用;或,分割 -->
        <property name="basePackage" value="com.mweb.mybatis.dao" />
        <!-- <property name="sqlSessionFactory" ref="sqlSessionFactory"></property> -->
    </bean>
 
    <bean id="txManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
 
    <tx:advice id="txAdvice" transaction-manager="txManager">
 
        <tx:attributes>
            <tx:method name="save*" rollback-for="com.mweb.system.util.MWebException" />
        </tx:attributes>
    </tx:advice>
    <aop:config>
        <aop:pointcut id="mWebServiceOperation"
            expression="execution(*
        com.mweb..*.service..*Service.*(..))" />
        <aop:advisor advice-ref="txAdvice" pointcut-ref="mWebServiceOperation" />
    </aop:config>
 
    <!--
        <bean id="dataSource"
        class="org.springframework.jndi.JndiObjectFactoryBean"> <property
        name="jndiName"> <value>java:comp/env/jdbc/DBPool</value> </property>
        </bean>
    -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <constructor-arg ref="dataSource"></constructor-arg>
    </bean>
    <bean id="namedParameterJdbcTemplate"
        class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
        <constructor-arg ref="dataSource"></constructor-arg>
    </bean>
     
    <bean id="userDao" class="com.mweb.user.dao.impl.UserDaoImpl">
        <property name="jdbc" ref="jdbcTemplate"></property>
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <bean id="userService" class="com.mweb.user.service.UserService">
        <property name="dao" ref="userDao"></property>
        <property name="factory" ref="sqlSessionFactory"></property>
    </bean>
     
    <!-- 注意这里的表达式第一个*是返回所有。接下来是:那些包下的哪些类(*表示所有类).add*所有的add方法(..参数) -->
    <bean id="m_log" class="com.mweb.system.service.LogService">
    </bean>
    <bean id="around_log" class="com.mweb.system.service.LogAroundService">
    </bean>
     
    <aop:config>
            <!-- 注意这里的表达式第一个*是返回所有。接下来是:那些包下的哪些类(*表示所有类).add*所有的add方法(..参数) -->
            <aop:pointcut id="allMethod"
                expression="execution(*
        com.mweb..*.service..*Service.*(..))" />
        <aop:advisor advice-ref="m_log" pointcut-ref="allMethod" />
    </aop:config>
 
</beans>
mybatis生成代码方式:
mybatis生成代码方式:
 1.下载mybatis-generator-core-1.3.2.jar
 2.下载数据库驱动包
 3.编写配置文件generator.xml 内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
    <!-- 数据库驱动包位置 -->
    <classPathEntry location="C:Userslwx155211Desktoplolspringmybatistoolsojdbc14-10g.jar" />
    <!--<classPathEntry location="C:oracleproduct10.2.0db_1jdbclibojdbc14.jar" /> -->
    <context id="DB2Tables" targetRuntime="MyBatis3">
        <commentGenerator>
            <property name="suppressAllComments" value="true" />
        </commentGenerator>
        <!-- 数据库链接URL、用户名、密码 -->
        <!-- <jdbcConnection driverClass="oracle.jdbc.driver.OracleDriver" connectionURL="jdbc:oracle:thin:@localhost:1521:orcl" userId="msa" password="msa">
        -->
        <jdbcConnection driverClass="oracle.jdbc.driver.OracleDriver" connectionURL="jdbc:oracle:thin:@10.137.26.50:1521:INOMC" userId="portal" password="portal">
        </jdbcConnection>
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>
        <!-- 生成模型的包名和位置 -->
        <javaModelGenerator targetPackage="com.mweb.mybatis.model" targetProject="D:workspace8mWebsrc">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>
        <!-- 生成的映射文件包名和位置 -->
        <sqlMapGenerator targetPackage="com.mweb.mybatis.mapping" targetProject="D:workspace8mWebsrc">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>
        <!-- 生成DAO的包名和位置 -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.mweb.mybatis.dao" targetProject="D:workspace8mWebsrc">
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>
        <!-- 要生成那些表(更改tableName和domainObjectName就可以) -->
        <table tableName="t_m400_servicenum" domainObjectName="ServiceNum" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" />
        <table tableName="t_m400_ecinfo" domainObjectName="EcInfo" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" />
         
    </context>
</generatorConfiguration>
4.执行如下命令:
  java -jar mybatis-generator-core-1.3.2.jar -configfile generator.xml -overwrite
wsdl文件使用ant生成webservice代码
wsdl文件使用ant生成webservice代码
使用ant工具 将wsdl文件生成webservice代码:
 文件目录结构
    ├─apache-ant-1.9.0
    ├─axis2-1.5.1
    ├─axis2-1.6.2
    ├─jre6
    └─wsdl2java
  在wsdl2java文件夹下创建如下文件
    wsdl2java.cmd
    wsdl2java.xml
    [wsdl2java][hide].reg
    [wsdl2java][show].reg
    文件内容:【[wsdl2java][hide].reg】
Windows Registry Editor Version 5.00
[-HKEY_CLASSES_ROOT.wsdl]
[-HKEY_CLASSES_ROOTwsdlfile]
    【[wsdl2java][show].reg】
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT.wsdl]
@="wsdlfile"
[HKEY_CLASSES_ROOTwsdlfileshellwsdl2java4all]
@="wsdl2java4all"
[HKEY_CLASSES_ROOTwsdlfileshellwsdl2java4allcommand]
@="cmd.exe /s /c D:/test/wsdl2java/wsdl2java.cmd %1 D:/test/wsdl2java codegen.all"
[HKEY_CLASSES_ROOTwsdlfileshellwsdl2java4client]
@="wsdl2java4client"
[HKEY_CLASSES_ROOTwsdlfileshellwsdl2java4clientcommand]
@="cmd.exe /s /c D:/test/wsdl2java/wsdl2java.cmd %1 D:/test/wsdl2java codegen.client"
    【wsdl2java.xml】
<?xml version="1.0" encoding="UTF-8"?>
<project name="CodegenExample" default="codegen.all" basedir=".">
    <property environment="env" />
    <property name="axis2.home" value="${env.AXIS2_HOME}" />
    <path id="codegen.class.path">
    <pathelement path="${java.class.path}"/>
        <fileset dir="${axis2.home}">
            <include name="lib/**.jar"/>
        </fileset>
    </path>
    <taskdef name="codegen"
             classname="org.apache.axis2.tool.ant.AntCodegenTask"
             classpathref="codegen.class.path" />
    <target name="codegen.all">
        <codegen wsdlfilename="${codegen.wsdl}"
                 output="${codegen.dest}"
                 serverside="true"
                 serversideinterface="true"
                 generateservicexml="true" generateAllClasses="true">
        </codegen>
        <ant antfile="build.xml" dir="${codegen.dest}" />
        <copy todir="${codegen.dest}/..">
            <fileset dir="${codegen.dest}/build/lib" includes="**/*.jar"/>
        </copy>
        <!--delete dir="${codegen.dest}" /-->
    </target>
    <target name="codegen.client">
        <codegen wsdlfilename="${codegen.wsdl}"
                 output="${codegen.dest}" unwrap="true">
        </codegen>
        <replace dir="${codegen.dest}" defaultexcludes="yes" encoding="UTF-8">
            <include name="**/*.java"/>
            <replacefilter token="_service.addOperation(__operation)" value="_service.addOperation(__operation);__operation.setSoapAction("")"/>
            <replacefilter token="_operationClient.getOptions().setAction(" value="//_operationClient.getOptions().setAction(" />
        </replace>
        <ant antfile="build.xml" dir="${codegen.dest}" />
        <copy todir="${codegen.dest}/..">
            <fileset dir="${codegen.dest}/build/lib" includes="**/*.jar"/>
        </copy>
        <delete dir="${codegen.dest}" />
    </target>
</project>
    【wsdl2java.cmd】
set ANT_HOME=%2..apache-ant-1.9.0
set AXIS2_HOME=%2..axis2-1.5.1
set PATH=%ANT_HOME%bin;%AXIS2_HOME%bin;%PATH%
set PARAM=%1
ant %3 -f %2wsdl2java.xml -Dcodegen.wsdl=%PARAM% -Dcodegen.dest=%PARAM:~0,-5%
单例模式和线程安全
    // 1.单例分两种:

    //    饿汉式  和 懒汉式

    // 饿汉式:

    package com.chess.test;  
      
    /** 
     *  
     * 饿汉模式的单例 
     * @author chess 
     * 
     */  
    public final class SignleObjectHungry  
    {  
      
        private static  SignleObjectHungry signleObjHun = new SignleObjectHungry();  
          
        private SignleObjectHungry()  
        {  
              
        }  
          
        public static SignleObjectHungry getInstance()  
        {  
            return signleObjHun;  
        }  
          
    }  



    // 懒汉式

    package com.chess.test;  
      
    /** 
     * 懒汉式单例模式 
     * @author chess 
     * 
     */  
    public final class SingleObjectLazy   
    {  
      
        private static SingleObjectLazy signleObjLazy = null;  
          
        private SingleObjectLazy()  
        {  
              
        }  
          
        public static SingleObjectLazy getInstance()  
        {  
            if(null == signleObjLazy)  
            {  
                signleObjLazy = new SingleObjectLazy();  
            }  
            return signleObjLazy;  
        }  
          
    }  

//  由于单例存在线程安全问题,所以要解决的话

//  对于

// 饿汉式线程安全

    package com.chess.test;  
      
    /** 
     * 饿汉式单例线程安全 
     * @author chess 
     * 
     */  
    public final class SingleObjectHungryAndThreadSafe   
    {  
      
        private static SingleObjectHungryAndThreadSafe signleObj = new SingleObjectHungryAndThreadSafe();  
          
          
        private SingleObjectHungryAndThreadSafe()  
        {  
              
        }  
          
        /** 
         * 加同步锁方法实现线程安全 
         *  
         * 此方法存在 性能开销 大 
         *  
         * @return 
         */  
        public synchronized static SingleObjectHungryAndThreadSafe getInstance()  
        {  
            return signleObj;  
        }  
          
          
    }  


//懒汉式线程安全

    package com.chess.test;  
      
    /** 
     * 懒汉式单例 和 线程安全 
     *  
     * @author chess 
     *  
     */  
    public final class SingleObjectLazyAndThreadSafe   
    {  
          
        private static SingleObjectLazyAndThreadSafe singleObj = null;  
      
        private SingleObjectLazyAndThreadSafe()   
        {  
      
        }  
      
        // public synchronized static SingleObjectLazyAndThreadSafe getInstance()  
        // {  
        //  if(null == singleObj)  
        //  {  
        //      singleObj = new SingleObjectLazyAndThreadSafe();  
        //  }  
        //        
        //  return singleObj;  
        //        
        // }  
      
        // 细化粒度,提高性能 提高线程并发度  
        //双重检查锁机制  
        public static SingleObjectLazyAndThreadSafe getInstance()  
        {  
            if (null == singleObj)  
            {  
                synchronized (SingleObjectHungryAndThreadSafe.class)   
                {  
                    if (null == singleObj)   
                    {  
                        singleObj = new SingleObjectLazyAndThreadSafe();  
                    }  
                }  
            }  
      
            return singleObj;  
      
        }  
          
        //至此 线程安全 已经感觉狠完美了。  
        //多线程中,如果  线程A 执行到第 30 行,此时对象为空,则进入初始化对象,  
        //      然而初始化对象需要时间,  
        //   此时 线程B 也执行到第 30 行 , 此时对象已经初始化未完成, 但是地址已经存在。  
        //   则 线程B 将获取一个未完成的 对象。  
          
    }  


//完美的解决方案

    package com.chess.test;  
      
      
    /** 
     * 单例模式线程安全的完美状态 
     * 新的设计模式 
     * 使用内部类   JLS会保证这个类的线程安全 
     * (完全使用 JAVA 虚拟机的机制进行同步保证,且 没有同步的关键字) 
     * @author chess 
     * 
     */  
    public class SingleObjectThreadSafeNoSync   
    {  
        /** 
         * 以内部类实现懒加载(懒汉) 
         *  
         * 初始化这个内部类的时候  JLS 保证这个类的线程安全 
         * @author cWX181783 
         * 
         */  
        private static class SingletonHolder  
        {  
            public final static SingleObjectThreadSafeNoSync singleObject =
                                                new SingleObjectThreadSafeNoSync();  
        }  
          
        public static SingleObjectThreadSafeNoSync getInstance()  
        {  
            return SingletonHolder.singleObject;  
        }  
      
    }  
Global site tag (gtag.js) - Google Analytics