举例讲解Java中synchronized关键字的用法

所属分类: 软件编程 / java 阅读数: 38
收藏 0 赞 0 分享

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

更多精彩内容其他人还在看

利用MultipartFile实现文件上传功能

这篇文章主要为大家详细介绍了利用MultipartFile实现文件上传功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Java编程实现NBA赛事接口调用实例代码

这篇文章主要介绍了Java编程实现NBA赛事接口调用实例代码,具有一定参考价值,需要的朋友可以了解下。
收藏 0 赞 0 分享

Java编程之双重循环打印图形

这篇文章主要介绍了Java编程之双重循环打印图形,属于Java编程基础练习部分,具有一定参考价值,需要的朋友可以了解下。
收藏 0 赞 0 分享

java基础学习JVM中GC的算法

这篇文章主要介绍了java基础学习JVM中GC的算法,通过图文加深对GC算法思路的理解。
收藏 0 赞 0 分享

Java编程Post数据请求和接收代码详解

这篇文章主要介绍了Java编程Post数据请求和接收代码详解,涉及enctype的三种编码,post与get等相关内容,具有一定参考价值,需要的朋友可以了解下。
收藏 0 赞 0 分享

Retrofit+Rxjava实现文件上传和下载功能

这篇文章主要介绍了Retrofit+Rxjava实现文件上传和下载功能,文中提到了单文件上传和多文件上传及相关参数的请求,需要的朋友参考下吧
收藏 0 赞 0 分享

Retrofit+Rxjava下载文件进度的实现

这篇文章主要介绍了Retrofit+Rxjava下载文件进度的实现,非常不错,具有参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

java检查服务器的连通两种方法代码分享

这篇文章主要介绍了java检查服务器的连通两种方法代码分享,涉及ping的介绍以及检查服务器连通的两种方法代码示例,具有一定参考价值,需要的朋友可以了解下。
收藏 0 赞 0 分享

Java/Android 获取网络重定向文件的真实URL的示例代码

本篇文章主要介绍了Java/Android 获取网络重定向文件的真实URL的示例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

java并发编程之同步器代码示例

这篇文章主要介绍了java并发编程之同步器代码示例,分享了相关代码,具有一定参考价值,需要的朋友可以了解下。
收藏 0 赞 0 分享
查看更多