Heim  >  Artikel  >  Java  >  Geben Sie ein Beispiel, um die Verwendung des synchronisierten Schlüsselworts in Java zu erläutern

Geben Sie ein Beispiel, um die Verwendung des synchronisierten Schlüsselworts in Java zu erläutern

高洛峰
高洛峰Original
2017-01-05 16:22:531386Durchsuche

Das synchronisierte Schlüsselwort wird, wie der Name schon sagt, zur Synchronisierung und zum gegenseitigen Ausschluss verwendet.

Hier ist eine kurze Anmerkung zu seiner Verwendung und Bedeutung:

1 Wenn synchronisiert diese oder eine nicht statische Methode oder eine Instanz ändert, wird die synchronisierte Sperre zu diesem oder dem Instanzobjekt hinzugefügt verweist auf das oben Gesagte. Beispielsweise sind a und b beide instanziierte Objekte der Main-Klasse. Wenn a eine synchronisierte Methode aufruft und b eine synchronisierte Methode aufruft, gibt es keinen gegenseitigen Ausschluss. Allerdings schließen sich die synchronisierten Methoden, die von Objekten a aus verschiedenen Threads aufgerufen werden, gegenseitig aus.

public synchronized void method(){
  //….
}
public void method()
{
  synchronized (this){
    //…..
  }
}

2. Wenn synchronisiert den Klassennamen.class oder die statische Methode ändert, kommt es zu gegenseitigem Ausschluss, auch wenn es sich um unterschiedliche Objekte handelt

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=&#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];
  }
}

Weitere Beispiele für Artikel Im Zusammenhang mit der Verwendung des synchronisierten Schlüsselworts in Java beachten Sie bitte die chinesische PHP-Website!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn