名前が示すように、同期されたキーワードは、相互除外を同期するために使用されます。
ここでは、その使用法と重要性を簡単に記録します。
1.同期した場合、これまたは非静的な方法またはインスタンスを変更すると、同期ロックがこのまたはインスタンスオブジェクト参照に追加されます。たとえば、AとBはどちらもメインクラスのインスタンス化されたオブジェクトです。 Aは同期された方法を呼び出し、Bは同期されたメソッドを呼び出し、相互に排他的なものを形成しません。ただし、異なるスレッドからのオブジェクトの同期メソッド呼び出しは相互に排他的です。
public synchronized void method(){//…。 } public void method(){synchronized(this){//…..}}2。1とは異なり、同期された場合、クラス名を変更する場合。
class main {public synchronized static void method1(){//…。 } public void method2(){synchronized(main.class)//}} 3.EG:
パッケージcom.asiainfolinkage.ems.web.controller.base; java.math.bigintegerをインポートします。 Import Java.util.date; java.util.hashmapをインポートします。 java.util.mapをインポートします。 java.util.randomをインポートします。 javax.servlet.http.httpservletrequestをインポートします。 javax.servlet.http.httpsessionをインポートします。 / *** TOKENを備えたコントローラー* @version 1.0 Copyright 2013年7月29日午後3時38:30*/パブリッククラスTokenbaseController {private static Map <String、String、String> Springmvc_token = new Hashmap <String、String>(); / **一意の値でトークンを生成*/ public string geneateguid(httpsession session){string token = "";日付date = new date(); Synchronized(SpringMVC_TOKEN){try {object obj = session.getAttribute(constants.spring_mvc_tokenname); if(obj!= null)springmvc_token =(map <string、string>)session.getattribute(constants.spring_mvc_tokenname); token = new biginteger(165、new Random())。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(IllegalStateException e){_log.error( "generateguid()mothod find bug、by token session ..."); }} tokenを返します。 } / **セッションのフォームトークン値とトークン値が一貫しているかどうかを確認* / public boolean validToken(httpservletrequest request){string inputToken = getInputToken(request); if(inputToken == null){_log.warn( "トークンは有効ではない!入力はnull"); falseを返します。 } httpsession session = request.getSession(); map <string、string> tokenmap =(map <string、string>)session.getAttribute(constants.spring_mvc_tokenname); if(tokenmap == null || tokenmap.size()<1){_log.warn( "tokenは有効ではありません!sessiontoken is null"); falseを返します。 } string sessiontoken = tokenmap.get(constants.default_token_name + "。" + inputToken); if(!inputtoken.equals(sessiontoken)){_log.warn( "トークンは有効ではありません!inputtoken = '" + inputToken + "'、sessiontoken = '" + sessiontoken + "'"); falseを返します。 } tokenmap.remove(constants.default_token_name + "。" + inputToken); session.setattribute(constants.spring_mvc_tokenname、tokenmap); trueを返します。 } / **フォームでトークン値を取得* / private string getInputToken(httpservletrequest request){map params = request.getParametermap(); if(!params.containskey(constants.default_token_name)){_log.warn( "paramsでトークン名を見つけることができなかった。"); nullを返します。 } string [] tokens =(string [])(string [])paramseg(constants.default_token_name); if((tokens == null)||(tokens.length <1)){_log.warn( "nullまたは空のトークン名を取得しました。"); nullを返します。 } tokens [0]を返します。 }}