Como su nombre indica, la palabra clave sincronizada se usa para sincronizar la exclusión mutua.
Aquí registraré brevemente su uso y significado:
1. Cuando se sincronizado modifica este o un método no estático o una instancia, el bloqueo sincronizado se agrega a esta referencia de objeto de instancia. Por ejemplo, A y B son objetos instanciados de la clase principal. A llama al método sincronizado, y B llama al método sincronizado, y no forma una mutuamente excluyente. Sin embargo, las llamadas del método sincronizado de un objeto de diferentes hilos son mutuamente excluyentes.
Método void sincronizado público () {//…. } public void Method () {Synchronized (this) {// ... ..}}2. A diferencia de 1, cuando se sincronizado modifica el nombre de clase. Método de clase o estática, incluso los objetos diferentes se formarán exclusivos mutuos.
Clase Main {public sincronizado static void Method1 () {// ... } public void Method2 () {Synchronized (Main.class) //}} 3.eg:
paquete 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; / *** Controlador con token* @Version 1.0 Copyright 29 de julio de 2013 a las 3:38:30 pm*/ public abstract Class tokenBaseController extiende BaseController {Maps estático privado <String, String> SpringMVC_Token = New HashMap <String, String> (); / ** Genere un token con un valor único*/ public String generateGuid (session httpsession) {string token = ""; Fecha fecha = nueva fecha (); sincronizado (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 (ilegalStateException e) {_log.error ("generateguid () mothod encontrar error, por sesión de token ..."); }} return token; } / ** Verifique si el valor de token de formulario y el valor del token en la sesión son consistentes* / public Boolean ValidToken (HttpServletRequest) {String inputToken = getInputToken (solicitud); if (inputToken == null) {_log.warn ("El token no es válido! InputToken es nulo"); devolver falso; } 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 ("El token no es válido! SessionToken es nulo"); devolver falso; } Cadena sessionToken = tokenmap.get (constants.default_token_name + "." + InputToken); if (! inputToken.equals (sessionToken)) {_log.warn ("token no es válido! InputToken = '" + inputToken + "', sessionToken = '" + sessionToken + "'"); devolver falso; } tokenmap.remove (constants.default_token_name + "." + inputToken); session.SetAttribute (constants.spring_mvc_tokenname, tokenmap); devolver verdadero; } / ** Obtenga el valor del token en el formulario* / String private getInputToken (solicitud httpservletRequest) {map params = request.getParametermap (); if (! params.containskey (constants.default_token_name)) {_log.warn ("no pudo encontrar el nombre de token en los parámetros"); regresar nulo; } String [] tokens = (string []) (string []) params.get (constants.default_token_name); if ((tokens == null) || (tokens.length <1)) {_log.warn ("obtuve un nombre de token nulo o vacío"); regresar nulo; } tokens de retorno [0]; }}