举例讲解Java中synchronized关键字的用法
程序员文章站
2024-03-09 15:20:17
synchronized关键字顾名思义,是用于同步互斥的作用的。
这里精简的记一下它的使用方法以及意义:
1. 当synchronized修饰 this或者非静态方法或...
synchronized关键字顾名思义,是用于同步互斥的作用的。
这里精简的记一下它的使用方法以及意义:
1. 当synchronized修饰 this或者非静态方法或者是一个实例的时候,所同步的锁是加在this或者实例对象引用上面的。比如a,b同为main类的实例化对象,a调用被同步的方法,和b调用被同步的方法,没有形成互斥。但是不同线程的a对象调用被同步的方法就被互斥了。
public synchronized void method(){ //…. } public void method() { synchronized (this){ //….. } }
2.与1不同,当synchronized修饰类名.class 或者静态方法的时候. 就算是不同对象,也会形成互斥
class main { public synchronized static void method1(){ //…. } public void method2(){ synchronized(main.class) // } }
3.eg:
package com.asiainfolinkage.ems.web.controller.base; import java.math.biginteger; import java.util.date; import java.util.hashmap; import java.util.map; import java.util.random; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpsession; /** * 附带token的控制器 * @version 1.0 copyright 2013年7月29日 下午3:38:30 */ public abstract class tokenbasecontroller extends basecontroller { private static map<string, string> springmvc_token = new hashmap<string, string>(); /** 生成一个唯一值的token */ public string generateguid(httpsession session) { string token = ""; date 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..."); } } return token; } /** 验证表单token值和session中的token值是否一致 */ public boolean validtoken(httpservletrequest request) { string inputtoken = getinputtoken(request); if (inputtoken == null) { _log.warn("token is not valid!inputtoken is null"); return 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 is not valid!sessiontoken is null"); return false; } string sessiontoken = tokenmap.get(constants.default_token_name + "." + inputtoken); if (!inputtoken.equals(sessiontoken)) { _log.warn("token is not valid!inputtoken='" + inputtoken + "',sessiontoken = '" + sessiontoken + "'"); return false; } tokenmap.remove(constants.default_token_name + "." + inputtoken); session.setattribute(constants.spring_mvc_tokenname, tokenmap); return true; } /** 获取表单中token值 */ private string getinputtoken(httpservletrequest request) { map params = request.getparametermap(); if (!params.containskey(constants.default_token_name)) { _log.warn("could not find token name in params."); return null; } string[] tokens = (string[]) (string[]) params.get(constants.default_token_name); if ((tokens == null) || (tokens.length < 1)) { _log.warn("got a null or empty token name."); return null; } return tokens[0]; } }