1.java get请求的getInstance 如何使用?2.下面的代码是什么意思

1.java的getInstance() 如何使用?2.下面的代码是什么意思? - 知乎171被浏览21038分享邀请回答public class Smarty {
private static Smarty instance;
private Smarty() {}
public static Smarty getInstance() {
if(instance == null)
instance = new Smarty();
return instance;
好了,现在instance只会在第一次getInstance被call的时候被创建。但是不好意思,多线程的情况下咋办?恩,似乎应该这样:public class Smarty {
private static Smarty instance;
private Smarty() {}
public synchronized static Smarty getInstance() {
if(instance == null)
instance = new Smarty();
return instance;
看起来不错了,但是每次调用getInstance()都需要synchronized,似乎还可以改进:public class Smarty {
private static Smarty instance;
private Smarty() {}
public static Smarty getInstance() {
if(instance == null) {
synchronized(Smarty.class) {
instance = new Smarty();
return instance;
这样行了吗?好像可以了,但是有个bug,十个线程都进行了null check,但都还没进入synchonized block,大家一起排队等着吃果果。于是十个Smarty排着队被产出来了。不行。那这样呢:public class Smarty {
private static Smarty instance;
private Smarty() {}
public static Smarty getInstance() {
if(instance == null) {
synchronized(Smarty.class) {
if(instance == null) {
instance = new Smarty();
return instance;
你们不是排队等着进来吃果果吗?进来了我再来check一次,这下不可能产出10个了吧。看起来已经完美了,可惜还是不行。这个可能不太好理解,但是下面这一行不是atomic的操作,它实际被分成几个步骤:allocate memory, assign allocated memory to instance ref, initialize the object Smarty into the allocated memory.instance = new Smarty();
所以说如果线程1卡在第三步那里,线程2高高兴兴滴进来拿instance了,他会拿到一个还没煮好的蛋,吃下去,完蛋了。有个keyword,可能一般你很少用到,叫volatile:public class Smarty {
private static volatile Smarty instance;
private Smarty() {}
public static Smarty getInstance() {
if(instance == null) {
synchronized(Smarty.class) {
if(instance == null) {
instance = new Smarty();
return instance;
volatile是什么鬼?看看定义:What is the Java volatile keyword?Essentially, volatile is used to indicate that a variable's value will be modified by different .Declaring a volatile Java variable means:The value of this variable will never be cached thread-locally: all reads and writes will go straight to "main memory";Access to the variable acts as though it is enclosed in a , synchronized on itself.第二点,正是我们需要的,我还没煮完的鸡蛋你先别拿。恩,终于可以了。但是,据说大部分JVM的implementation并不尊重volatile的规则。完蛋啦,搞了半天还是没法确定可以完美做singleton。别紧张,这样写就没问题了。正确的Java Singleton 写法:public class Smarty {
private Smarty() {}
private static class SmartyLoader {
private static final Smarty instance = new Smarty();
public static Smarty getInstance() {
return SmartyLoader.instance;
因为Inner class的loading是在它第一次被调用的时候。合着整了半天就是这么简单。还有一种写法,Java 5之后可用:public enum Smarty {
就是这么简单粗暴直接。下次碰到谁装逼说什么double locking singleton的,上去piapia俩巴掌,甩个enum过去到他脸上,瞬间B格爆满了有没有???不客气!24439 条评论分享收藏感谢收起记住登录一个月发表随想还能输入:200字该用户最新代码编程随想&by by by by by by [java]代码库
//使用第一种方式的单例模式类,通过公共属性来创建对象
public class SingletonDemo2 {
//第一种实现单例模式的方法,通过公共属性来实现实例化
//声明一个公共的静态属性,使只被实例化一次
public static final SingletonDemo2 singletonDemo = new SingletonDemo2();
//声明一个私有的构造方法,使别人不能随便new对象
private SingletonDemo2() {}
//普通的方法
public void singleMethor() {
System.out.println ("singleMethor");
//使用第二种方式的单例模式类,通过.getInstance()来创建对象
public class SingletonDemo3 {
//第二种实现单例模式的方法,通过方法来实现实例化
//声明一个私有的静态属性,使只被实例化一次
private static final SingletonDemo3 singletonDemo = new SingletonDemo3();
//声明一个私有的构造方法,使别人不能随便new对象
//它只被调用一次,实例存在之后就不再调用了
private SingletonDemo3() {}
//声明一个公共的静态方法,外界通过调用这个方法来得到唯一的实例
public static SingletonDemo3 getInstance() {
return singletonD
//普通的方法
public void singleMethor() {
System.out.println ("singleMethor");
分享到:更多发表评论:评论须知:1、评论每次加2分,每天上限为30;2、请文明用语,共同创建干净的技术交流环境;3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。JavaMail邮件发送-发送一个文本邮件和一些问题说明 - java小强 - ITeye博客
博客分类:
需要下载的JAR包:
JavaMail:
加入的包有:mail.jar activation.jar
你要准备一个邮箱账户,就用网易的吧,然后打开SMTP功能
关于网易的一些端口信息参考下面:
每个公司都是不一样的,使用SSL的和不实用的也不一样
使用的开发和编译环境是JDK1.4,如果你使用的是JDK1.5环境,那么你的环境需要修改一些东西,找到 javaee.jar 删除里面的 mial 包,否则会有冲突
否则会报错:
Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream
at javax.mail.Session.loadProvidersFromStream(Session.java:928)
at javax.mail.Session.access$000(Session.java:174)
at javax.mail.Session$1.load(Session.java:870)
at javax.mail.Session.loadResource(Session.java:1084)
at javax.mail.Session.loadProviders(Session.java:889)
at javax.mail.Session.&init&(Session.java:210)
at javax.mail.Session.getInstance(Session.java:249)
at com.mail.TextMail.main(TextMail.java:22)
下面我直接贴代码了
package com.
import java.util.D
import java.util.P
import javax.mail.M
import javax.mail.S
import javax.mail.T
import javax.mail.internet.InternetA
import javax.mail.internet.MimeM
import javax.mail.internet.MimeU
// 如果你使用JDK1.4以上运行 会出现 Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream
// 需要你找到 javaee.jar 删掉 里面的 mail 包
public class TextMail {
public static void main(String[] args) throws Exception {
// 配置文件对象
Properties props = new Properties();
// 邮箱服务地址
props.put( "mail.smtp.host ", " ");
// 是否进行验证
props.put("mail.smtp.auth", "true");
// 创建一个会话
Session session = Session.getInstance(props);
// 打开调试,会打印与邮箱服务器回话的内容
session.setDebug(true);
Message message = new MimeMessage(session);
// 如果发送人没有写对,那么会出现 javamail 550 Invalid User
// 如果发送人写的和使用的帐号不一致,则会出现 553 Mail from must equal authorized user
InternetAddress from = new InternetAddress("");
from.setPersonal(MimeUtility.encodeText("java小强&&"));
message.setFrom(from);
InternetAddress to = new InternetAddress("");
message.setRecipient(Message.RecipientType.TO, to);
message.setSubject(MimeUtility.encodeText("强哥邀请,谁敢不从!"));
message.setText("强哥邀请你访问我的博客:/!");
message.setSentDate(new Date());
Transport transport = session.getTransport("smtp");
// 具体你使用邮箱的smtp地址和端口,应该到邮箱里面查看,如果使用了SSL,网易的端口应该是 465/994
transport.connect("", 25, "test00", "test123456");
transport.sendMessage(message, message.getAllRecipients());
transport.close();
System.out.println("发送完毕");
需要注意的有
InternetAddress from = new InternetAddress("");
transport.connect("", 25, "test00", "test123456");
这两个邮箱的地址必须相同,否则会出现
Exception in thread "main" javax.mail.MessagingException: 553 Mail from must equal authorized user
at com.sun.mail.smtp.SMTPTransport.issueCommand(SMTPTransport.java:1020)
at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:716)
at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:388)
at com.mail.TextMail.main(TextMail.java:38)
你上网查都是说用户验证不对,其实一般大家都是按照别人代码拷贝的,然后修改了用户和密码,怎么会不对!
我这个账户和密码都是可以用的,对不起网易了!
由于上面我设置了打印调试,所以你在控制台会看到如下内容:
DEBUG: setDebug: JavaMail version 1.3.1
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "", port 25
Anti-spam GT for Coremail System (163com[])
DEBUG SMTP: connected to host "", port: 25
EHLO cuisuqiang
250-PIPELINING
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-coremail 1Uxr2xKj7kG0xkI17xGrU7I0s8FY2U3Uj8Cz28x1UUUUU7Ic2I0Y2UrgdNesUCa0xDrUUUUj
250-STARTTLS
250 8BITMIME
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN"
DEBUG SMTP: Found extension "AUTH=LOGIN", arg "PLAIN"
DEBUG SMTP: Found extension "coremail", arg "1Uxr2xKj7kG0xkI17xGrU7I0s8FY2U3Uj8Cz28x1UUUUU7Ic2I0Y2UrgdNesUCa0xDrUUUUj"
DEBUG SMTP: Found extension "STARTTLS", arg ""
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Attempt to authenticate
AUTH LOGIN
334 dXNlcm5hbWU6
dGVzdDIwMTIwNzExMTIwMjAw
334 UGFzc3dvcmQ6
dGVzdDEyMzQ1Ng==
235 Authentication successful
DEBUG SMTP: use8bit false
MAIL FROM:&&
250 Mail OK
RCPT TO:&&
250 Mail OK
DEBUG SMTP: Verified Addresses
DEBUG SMTP:
354 End data with &CR&&LF&.&CR&&LF&
Message-ID: &.JavaMail.Administrator@cuisuqiang&
Date: Wed, 11 Jul :45 +0800 (CST)
From: "=?GBK?Q?java=D0=A1=C7=BF&&?=" &&
Subject: =?GBK?B?x7+459H7x+ujrMutuNKyu7TTo6E=?=
Mime-Version: 1.0
Content-Type: text/ charset=GBK
Content-Transfer-Encoding: quoted-printable
=C7=BF=B8=E7=D1=FB=C7=EB=C4=E3=B7=C3=CE=CA=CE=D2=B5=C4=B2=A9=BF=CD=A3=BAhtt=
p:///=A3=A1
250 Mail OK queued as smtp2,DNGowEB52UhcO_1PZmMMCA--.937S2
这些都是程序与邮件服务商的一些交互信息!
请您到ITEYE看我的原创:
或支持我的个人博客,地址:
浏览 21762
cuisuqiang
浏览: 2657485 次
来自: 北京
浏览量:2454971
cuisuqiang 写道jlcon 写道chenqidou
这个字段用法是如果相互之类超过多少时间没有数据交互,才抛出的正 ...
页面还是jsp,怎么能叫做Freemarker入门示例呢?小强 ...
学习了! 用了这个方法,就不会阻塞了
用setField返回一些简单,重要的信息,不要保存太多的信息 ...1.java的getInstance() 如何使用?2.下面的代码是什么意思? - 知乎171被浏览21038分享邀请回答public abstract class Calendar implements Serializable, Cloneable, Comparable&Calendar& {
public static Calendar getInstance() {
Calendar cal = createCalendar(TimeZone.getDefaultRef(), Locale.getDefault());
cal.sharedZone = true;
return cal;
private static Calendar createCalendar(TimeZone zone, Locale aLocale) {
// If the specified locale is a Thai locale, returns a BuddhistCalendar
// instance.
if ("th".equals(aLocale.getLanguage())
&& ("TH".equals(aLocale.getCountry()))) {
return new sun.util.BuddhistCalendar(zone, aLocale);
} else if ("JP".equals(aLocale.getVariant())
&& "JP".equals(aLocale.getCountry())
&& "ja".equals(aLocale.getLanguage())) {
return new JapaneseImperialCalendar(zone, aLocale);
// else create the default calendar
return new GregorianCalendar(zone, aLocale);
class JapaneseImperialCalendar extends Calendar {
public JapaneseImperialCalendar(TimeZone zone, Locale aLocale) {
super(zone, aLocale);
jdate = jcal.newCalendarDate(zone);
setTimeInMillis(System.currentTimeMillis());
下面来回答问题里的代码,可能顺序和问题里的不同,简单来说就是这段代码提供了一个Smarty的唯一公用实例。为类实例化一个静态的成员变量是单例模式的一种实现,通常作用是生成一个唯一的实例以供使用。public final class Boolean implements java.io.Serializable, Comparable&Boolean& {
public static final Boolean TRUE = new Boolean(true);
public static final Boolean FALSE = new Boolean(false);
不提供public的构造方法通常是为了防止通过new构造方法来实例化该类。public final class Matcher implements MatchResult {
Matcher() {
51 条评论分享收藏感谢收起Java SSLSocket的使用 -
- ITeye博客
博客分类:
1. 什么是SSLSocket
JDK文档指出,SSLSocket扩展Socket并提供使用SSL或TLS协议的安全套接字。
这种套接字是正常的流套接字,但是它们在基础网络传输协议(如TCP)上添加了安全保护层。
具体安全方面的讨论见下一篇。本篇重点关注SSLSocket及相关几个类的使用。
2. SSLSocket和相关类
SSLSocket来自jsse(Java Secure Socket Extension)。
(1)SSLContext: 此类的实例表示安全套接字协议的实现, 它是SSLSocketFactory、SSLServerSocketFactory和SSLEngine的工厂。
(2)SSLSocket: 扩展自Socket
(3)SSLServerSocket: 扩展自ServerSocket
(4)SSLSocketFactory: 抽象类,扩展自SocketFactory, SSLSocket的工厂
(5)SSLServerSocketFactory: 抽象类,扩展自ServerSocketFactory, SSLServerSocket的工厂
(6)KeyStore: 表示密钥和证书的存储设施
(7)KeyManager: 接口,JSSE密钥管理器
(8)TrustManager: 接口,信任管理器(?翻译得很拗口)
(9)X590TrustedManager: TrustManager的子接口,管理X509证书,验证远程安全套接字
3. SSLContext的使用
public static void main(String[] args) throws Exception {
X509TrustManager x509m = new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
public void checkServerTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
public void checkClientTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
// 获取一个SSLContext实例
SSLContext s = SSLContext.getInstance("SSL");
// 初始化SSLContext实例
s.init(null, new TrustManager[] { x509m },
new java.security.SecureRandom());
// 打印这个SSLContext实例使用的协议
System.out.println("缺省安全套接字使用的协议: " + s.getProtocol());
// 获取SSLContext实例相关的SSLEngine
SSLEngine e = s.createSSLEngine();
System.out
.println("支持的协议: " + Arrays.asList(e.getSupportedProtocols()));
System.out.println("启用的协议: " + Arrays.asList(e.getEnabledProtocols()));
System.out.println("支持的加密套件: "
+ Arrays.asList(e.getSupportedCipherSuites()));
System.out.println("启用的加密套件: "
+ Arrays.asList(e.getEnabledCipherSuites()));
运行结果如下:
SSLContext.getProtocol(): 返回当前SSLContext对象的协议名称
SSLContext.init():
初始化当前SSLContext对象。 三个参数均可以为null。 详见JDK文档。
SSLEngine.getSupportedProtocols()等几个方法可以返回些 Engine上支持/已启用的协议、支持/已启用的加密套件
4. SSLSocket和SSLServerSocket的使用
这两个类的用法跟Socket/ServerSocket的用法比较类似。看下面的例子(主要为了验证SSLSocket的用法 ,I/O和多线程处理比较随意)
4.1 SSLServerSocket
(1)新建一个SSLServerSocket,并开始监听来自客户端的连接
// 抛出异常
// javax.net.ssl.SSLException: No available certificate or key corresponds
// to the SSL cipher suites which are enabled.
public static void notOk() throws IOException {
SSLServerSocketFactory factory = (SSLServerSocketFactory) SSLServerSocketFactory
.getDefault();
SSLServerSocket server = (SSLServerSocket) factory
.createServerSocket(10000);
System.out.println("ok");
server.accept();
server.accept()处抛出异常, 提示缺少证书。与ServerSocket不同, SSLServerSocket需要证书来进行安全验证。
使用keytool工具生成一个证书。 步骤如下, 得到一个名为cmkey的证书文件
(2)重新完善上面的代码。 主要增加两个功能: 使用名为cmkey的证书初始化SSLContext, echo客户端的消息。 代码如下
// 启动一个ssl server socket
// 配置了证书, 所以不会抛出异常
public static void sslSocketServer() throws Exception {
// key store相关信息
String keyName = "cmkey";
char[] keyStorePwd = "123456".toCharArray();
char[] keyPwd = "123456".toCharArray();
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
// 装载当前目录下的key store. 可用jdk中的keytool工具生成keystore
InputStream in =
keyStore.load(in = Test2.class.getClassLoader().getResourceAsStream(
keyName), keyPwd);
in.close();
// 初始化key manager factory
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory
.getDefaultAlgorithm());
kmf.init(keyStore, keyPwd);
// 初始化ssl context
SSLContext context = SSLContext.getInstance("SSL");
context.init(kmf.getKeyManagers(),
new TrustManager[] { new MyX509TrustManager() },
new SecureRandom());
// 监听和接收客户端连接
SSLServerSocketFactory factory = context.getServerSocketFactory();
SSLServerSocket server = (SSLServerSocket) factory
.createServerSocket(10002);
System.out.println("ok");
Socket client = server.accept();
System.out.println(client.getRemoteSocketAddress());
// 向客户端发送接收到的字节序列
OutputStream output = client.getOutputStream();
// 当一个普通 socket 连接上来, 这里会抛出异常
// Exception in thread "main" javax.net.ssl.SSLException: Unrecognized
// SSL message, plaintext connection?
InputStream input = client.getInputStream();
byte[] buf = new byte[1024];
int len = input.read(buf);
System.out.println("received: " + new String(buf, 0, len));
output.write(buf, 0, len);
output.flush();
output.close();
input.close();
// 关闭socket连接
client.close();
server.close();
4.2 SSLSocket
(1)我们先使用一个普通的Socket尝试连接服务器端
// 通过socket连接服务器
public static void socket() throws UnknownHostException, IOException {
Socket s = new Socket("localhost", 10002);
System.out.println(s);
System.out.println("ok");
OutputStream output = s.getOutputStream();
InputStream input = s.getInputStream();
output.write("alert".getBytes());
System.out.println("sent: alert");
output.flush();
byte[] buf = new byte[1024];
int len = input.read(buf);
System.out.println("received:" + new String(buf, 0, len));
结果客户端和服务器端都出错。 客户端的错误是接收到乱码。
服务器则抛出异常
javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
(2)改成SSLSocket, 但是不使用证书。客户端抛出sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
// 不使用证书, 通过ssl socket连接服务器
// 抛出异常, 提示找不到证书
public static void sslSocket() throws UnknownHostException, IOException {
SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory
.getDefault();
SSLSocket s = (SSLSocket) factory.createSocket("localhost", 10002);
System.out.println("ok");
OutputStream output = s.getOutputStream();
InputStream input = s.getInputStream();
output.write("alert".getBytes());
System.out.println("sent: alert");
output.flush();
byte[] buf = new byte[1024];
int len = input.read(buf);
System.out.println("received:" + new String(buf, 0, len));
程序客户在不持有证书的情况下直接进行连接,服务器端会产生运行时异常javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_unknown,不允许进行连接。 我们可以指定像下面这样执行客户端,服务器端可以成功echo客户端的发出的字符串"alert"
-Djavax.net.ssl.trustStore=cmkey Client
这里的cmkey即前面生成的证书文件。
(3)改成SSLSocket, 对SSLContext进行如下初始化。
public static void sslSocket2() throws Exception {
SSLContext context = SSLContext.getInstance("SSL");
context.init(null,
new TrustManager[] { new Test2.MyX509TrustManager() },
new SecureRandom());
SSLSocketFactory factory = context.getSocketFactory();
SSLSocket s = (SSLSocket) factory.createSocket("localhost", 10002);
System.out.println("ok");
OutputStream output = s.getOutputStream();
InputStream input = s.getInputStream();
output.write("alert".getBytes());
System.out.println("sent: alert");
output.flush();
byte[] buf = new byte[1024];
int len = input.read(buf);
System.out.println("received:" + new String(buf, 0, len));
服务器端可以成功echo客户端的发出的字符串"alert"。 完整代码见附件。
下载次数: 515
下载次数: 119
浏览 39364
最后一个为什么初始化一个空的证书,也能连上?亲测,在client里没用keystore初始化context,读不出数据,因此要加上。String keyName = "cmkey";
char[] keyStorePwd = "123456".toCharArray();
char[] keyPwd = "123456".toCharArray();
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
// 装载当前目录下的key store. 可用jdk中的keytool工具生成keystore
InputStream in =
keyStore.load(in = ServerSsl.class.getClassLoader()
.getResourceAsStream(keyName), keyPwd);
in.close();
// 初始化key manager factory
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory
.getDefaultAlgorithm());
kmf.init(keyStore, keyPwd);
SSLContext context = SSLContext.getInstance("SSL");
context.init(kmf.getKeyManagers(),
new TrustManager[] { new ServerSsl.MyX509TrustManager() },
new SecureRandom());
浏览: 108208 次
来自: 武汉
用了博主的方法和代码,不同证书居然可以正常通讯?
sorry,运行时没看清。博主的代码确实没问题。。。
YoungeeOne 写道最后一个为什么初始化一个空的证书,也 ...
那这个的心跳怎么弄呢
busybox不是每台机器有安装的, 有没有比较裸的办法获取p ...}

我要回帖

更多关于 java get 1 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信