舉例講解Java中synchronized關(guān)鍵字的用法
synchronized關(guān)鍵字顧名思義,是用于同步互斥的作用的。
這里精簡的記一下它的使用方法以及意義:
1. 當(dāng)synchronized修飾 this或者非靜態(tài)方法或者是一個實例的時候,所同步的鎖是加在this或者實例對象引用上面的。比如a,b同為Main類的實例化對象,a調(diào)用被同步的方法,和b調(diào)用被同步的方法,沒有形成互斥。但是不同線程的a對象調(diào)用被同步的方法就被互斥了。
public synchronized void method(){
//….
}
public void method()
{
synchronized (this){
//…..
}
}
2.與1不同,當(dāng)synchronized修飾類名.class 或者靜態(tài)方法的時候. 就算是不同對象,也會形成互斥
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];
}
}
- 深入理解java中的synchronized關(guān)鍵字
- 詳解Java中synchronized關(guān)鍵字的死鎖和內(nèi)存占用問題
- Java中synchronized關(guān)鍵字修飾方法同步的用法詳解
- java多線程編程之使用Synchronized關(guān)鍵字同步類方法
- Java關(guān)鍵字volatile和synchronized作用和區(qū)別
- 實例解析Java中的synchronized關(guān)鍵字與線程安全問題
- 深入了解Java中Synchronized關(guān)鍵字的實現(xiàn)原理
- java基本教程之synchronized關(guān)鍵字 java多線程教程
- java synchronized關(guān)鍵字的用法
- Java中synchronized關(guān)鍵字鎖的力度與位置示例詳解
相關(guān)文章
Springboot實現(xiàn)郵箱驗證碼注冊與修改密碼及登錄功能詳解流程
驗證碼作為一種自然人的機器人的判別工具,被廣泛的用于各種防止程序做自動化的場景中。傳統(tǒng)的字符型驗證安全性已經(jīng)名存實亡的情況下,各種新型的驗證碼如雨后春筍般涌現(xiàn),今天給大家分享一篇SpringBoot實現(xiàn)滑塊驗證碼2022-11-11
SpringBoot使用druid配置多數(shù)據(jù)源問題
這篇文章主要介紹了SpringBoot使用druid配置多數(shù)據(jù)源問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03
使用Feign調(diào)用注解組件(實現(xiàn)字段賦值功能)
這篇文章主要介紹了使用Feign調(diào)用注解組件(實現(xiàn)字段賦值功能),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03

