举例讲解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]; } }