欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

举例讲解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]; 
  } 
}