>  기사  >  Java  >  Java에서 동기화 키워드의 사용법을 설명하는 예를 들어보세요.

Java에서 동기화 키워드의 사용법을 설명하는 예를 들어보세요.

高洛峰
高洛峰원래의
2017-01-05 16:22:531376검색

동기화 키워드는 이름에서 알 수 있듯이 동기화 및 상호 배제에 사용됩니다.

사용법과 의미에 대한 간략한 설명은 다음과 같습니다.

1. 동기화가 this 또는 비정적 메서드나 인스턴스를 수정하면 동기화된 잠금이 이 또는 인스턴스 개체에 추가됩니다. 위 내용을 참고합니다. 예를 들어, a와 b는 모두 Main 클래스의 인스턴스화된 개체입니다. a가 동기화된 메서드를 호출하고 b가 동기화된 메서드를 호출하는 경우 상호 배제가 없습니다. 그러나 다른 스레드의 개체가 호출하는 동기화된 메서드는 상호 배타적입니다.

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

2. 1과 다르게, 클래스명.class나 static 메소드를 수정하는 경우에는 서로 다른 객체라도 상호 배제가 발생합니다.

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];
  }
}

기사 더보기 Java의 동기화 키워드 사용과 관련된 내용은 PHP 중국어 웹사이트를 참고하세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.