舉例講解Java中synchronized關(guān)鍵字的用法
synchronized關(guān)鍵字顧名思義,是用于同步互斥的作用的。
這里精簡(jiǎn)的記一下它的使用方法以及意義:
1. 當(dāng)synchronized修飾 this或者非靜態(tài)方法或者是一個(gè)實(shí)例的時(shí)候,所同步的鎖是加在this或者實(shí)例對(duì)象引用上面的。比如a,b同為Main類(lèi)的實(shí)例化對(duì)象,a調(diào)用被同步的方法,和b調(diào)用被同步的方法,沒(méi)有形成互斥。但是不同線(xiàn)程的a對(duì)象調(diào)用被同步的方法就被互斥了。
public synchronized void method(){ //…. } public void method() { synchronized (this){ //….. } }
2.與1不同,當(dāng)synchronized修飾類(lèi)名.class 或者靜態(tài)方法的時(shí)候. 就算是不同對(duì)象,也會(huì)形成互斥
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>(); /** 生成一個(gè)唯一值的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; } /** 驗(yàn)證表單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)存占用問(wèn)題
- JAVA面試題 簡(jiǎn)談你對(duì)synchronized關(guān)鍵字的理解
- Java中使用synchronized關(guān)鍵字實(shí)現(xiàn)簡(jiǎn)單同步操作示例
- 實(shí)例解析Java中的synchronized關(guān)鍵字與線(xiàn)程安全問(wèn)題
- java synchronized關(guān)鍵字的用法
- Java中復(fù)雜的Synchronized關(guān)鍵字使用方法詳解
相關(guān)文章
springboot使用shiro-整合redis作為緩存的操作
這篇文章主要介紹了springboot使用shiro-整合redis作為緩存的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06Mybatis之Select Count(*)的獲取返回int的值操作
這篇文章主要介紹了Mybatis之Select Count(*)的獲取返回int的值操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11如何優(yōu)雅的進(jìn)行Spring整合MongoDB詳解
這篇文章主要給大家介紹了如何優(yōu)雅的進(jìn)行Spring整合MongoDB的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-02-02基于Spring BeanUtils的copyProperties方法使用及注意事項(xiàng)
這篇文章主要介紹了基于Spring BeanUtils的copyProperties方法使用及注意事項(xiàng),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06java之向linux文件夾下寫(xiě)文件無(wú)權(quán)限的問(wèn)題
這篇文章主要介紹了java之向linux文件夾下寫(xiě)文件無(wú)權(quán)限的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09詳解關(guān)于Spring Cloud 框架熱部署的方法
本篇文章主要介紹了詳解關(guān)于Spring Cloud 框架熱部署的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11IDEA實(shí)現(xiàn)遠(yuǎn)程調(diào)試步驟詳解
這篇文章主要介紹了IDEA實(shí)現(xiàn)遠(yuǎn)程調(diào)試步驟詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09