Maison > Java > javaDidacticiel > Donnez un exemple pour expliquer l'utilisation du mot-clé synchronisé en Java

Donnez un exemple pour expliquer l'utilisation du mot-clé synchronisé en Java

高洛峰
Libérer: 2017-01-05 16:22:53
original
1440 Les gens l'ont consulté

Le mot-clé synchronisé, comme son nom l'indique, est utilisé pour la synchronisation et l'exclusion mutuelle.

Voici une note concise de son utilisation et de sa signification :

1 Lorsque synchronisé modifie ceci ou une méthode non statique ou une instance, le verrou synchronisé est ajouté à cet ou à l'objet instance. fait référence à ce qui précède. Par exemple, a et b sont tous deux des objets instanciés de la classe Main. Si a appelle une méthode synchronisée et b appelle une méthode synchronisée, il n'y a pas d'exclusion mutuelle. Cependant, les méthodes synchronisées appelées par des objets provenant de différents threads s'excluent mutuellement.

public synchronized void method(){
  //….
}
public void method()
{
  synchronized (this){
    //…..
  }
}
Copier après la connexion

2. Différent de 1, lorsque la synchronisation modifie le nom de la classe.classe ou la méthode statique, même s'il s'agit d'objets différents, une exclusion mutuelle se produira

Class Main
{
  public synchronized static void method1(){
    //….
  }
  public void method2(){
    synchronized(Main.class) // 
  }
}
Copier après la connexion

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=&#39;" + inputToken + "&#39;,sessionToken = &#39;" + sessionToken + "&#39;");
      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];
  }
}
Copier après la connexion

Plus d'exemples Pour les articles concernant l'utilisation du mot-clé synchronisé en Java, veuillez faire attention au site Web PHP chinois !


Étiquettes associées:
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers numéros
java - ReentrantLock et synchronisé
Depuis 1970-01-01 08:00:00
0
0
0
Impossible d'installer Java
Depuis 1970-01-01 08:00:00
0
0
0
Java peut-il être utilisé comme backend du Web ?
Depuis 1970-01-01 08:00:00
0
0
0
Installer JAVA
Depuis 1970-01-01 08:00:00
0
0
0
Aide : Données chiffrées JAVA Décryptage PHP
Depuis 1970-01-01 08:00:00
0
0
0
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal