举例讲解Java中synchronized关键字的用法
synchronized关键字顾名思义,是用于同步互斥的作用的。
这里精简的记一下它的使用方法以及意义:
1.当synchronized修饰this或者非静态方法或者是一个实例的时候,所同步的锁是加在this或者实例对象引用上面的。比如a,b同为Main类的实例化对象,a调用被同步的方法,和b调用被同步的方法,没有形成互斥。但是不同线程的a对象调用被同步的方法就被互斥了。
publicsynchronizedvoidmethod(){
//….
}
publicvoidmethod()
{
synchronized(this){
//…..
}
}
2.与1不同,当synchronized修饰类名.class或者静态方法的时候.就算是不同对象,也会形成互斥
ClassMain
{
publicsynchronizedstaticvoidmethod1(){
//….
}
publicvoidmethod2(){
synchronized(Main.class)//
}
}
3.eg:
packagecom.asiainfolinkage.ems.web.controller.base;
importjava.math.BigInteger;
importjava.util.Date;
importjava.util.HashMap;
importjava.util.Map;
importjava.util.Random;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpSession;
/**
*附带token的控制器
*@version1.0Copyright2013年7月29日下午3:38:30
*/
publicabstractclassTokenBaseControllerextendsBaseController{
privatestaticMap<String,String>springmvc_token=newHashMap<String,String>();
/**生成一个唯一值的token*/
publicStringgenerateGUID(HttpSessionsession){
Stringtoken="";
Datedate=newDate();
synchronized(springmvc_token){
try{
Objectobj=session.getAttribute(Constants.SPRING_MVC_TOKENNAME);
if(obj!=null)
springmvc_token=(Map<String,String>)session.getAttribute(Constants.SPRING_MVC_TOKENNAME);
token=newBigInteger(165,newRandom()).toString(36).toUpperCase();
springmvc_token.put(Constants.DEFAULT_TOKEN_NAME+"."+token,token);
session.setAttribute(Constants.SPRING_MVC_TOKENNAME,springmvc_token);
Constants.TOKEN_VALUE=token;
}catch(IllegalStateExceptione){
_log.error("generateGUID()mothodfindbug,bytokensession...");
}
}
returntoken;
}
/**验证表单token值和session中的token值是否一致*/
publicbooleanvalidToken(HttpServletRequestrequest){
StringinputToken=getInputToken(request);
if(inputToken==null){
_log.warn("tokenisnotvalid!inputTokenisNULL");
returnfalse;
}
HttpSessionsession=request.getSession();
Map<String,String>tokenMap=(Map<String,String>)session.getAttribute(Constants.SPRING_MVC_TOKENNAME);
if(tokenMap==null||tokenMap.size()<1){
_log.warn("tokenisnotvalid!sessionTokenisNULL");
returnfalse;
}
StringsessionToken=tokenMap.get(Constants.DEFAULT_TOKEN_NAME+"."+inputToken);
if(!inputToken.equals(sessionToken)){
_log.warn("tokenisnotvalid!inputToken='"+inputToken+"',sessionToken='"+sessionToken+"'");
returnfalse;
}
tokenMap.remove(Constants.DEFAULT_TOKEN_NAME+"."+inputToken);
session.setAttribute(Constants.SPRING_MVC_TOKENNAME,tokenMap);
returntrue;
}
/**获取表单中token值*/
privateStringgetInputToken(HttpServletRequestrequest){
Mapparams=request.getParameterMap();
if(!params.containsKey(Constants.DEFAULT_TOKEN_NAME)){
_log.warn("Couldnotfindtokennameinparams.");
returnnull;
}
String[]tokens=(String[])(String[])params.get(Constants.DEFAULT_TOKEN_NAME);
if((tokens==null)||(tokens.length<1)){
_log.warn("Gotanulloremptytokenname.");
returnnull;
}
returntokens[0];
}
}