一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - 舉例講解Java中synchronized關鍵字的用法

舉例講解Java中synchronized關鍵字的用法

2020-04-20 13:53Ai2015WER JAVA教程

這篇文章主要介紹了Java中synchronized關鍵字的用法,針對synchronized修飾方法的使用作出了簡單講解和演示,需要的朋友可以參考下

synchronized關鍵字顧名思義,是用于同步互斥的作用的。

這里精簡的記一下它的使用方法以及意義:

1. 當synchronized修飾 this或者非靜態方法或者是一個實例的時候,所同步的鎖是加在this或者實例對象引用上面的。比如a,b同為Main類的實例化對象,a調用被同步的方法,和b調用被同步的方法,沒有形成互斥。但是不同線程的a對象調用被同步的方法就被互斥了。

?
1
2
3
4
5
6
7
8
9
public synchronized void method(){
  //….
}
public void method()
{
  synchronized (this){
    //…..
  }
}

2.與1不同,當synchronized修飾類名.class 或者靜態方法的時候. 就算是不同對象,也會形成互斥

?
1
2
3
4
5
6
7
8
9
Class Main
{
  public synchronized static void method1(){
    //….
  }
  public void method2(){
    synchronized(Main.class) // 
  }
}

3.eg:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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教程C/C++和Java的交互詳解

    C/C++和Java的交互詳解

    本文旨在簡單的介紹一下如何讓java層和C/C++層相互調用,這里主要是使用了JNI技術,并沒有深究其原理,只是做了個實現,其目的是為后面的學習打開一扇...

    hebedich1872020-03-25
  • JAVA教程java針對電話號碼正則匹配實例

    java針對電話號碼正則匹配實例

    這篇文章主要介紹了java針對電話號碼正則匹配的方法,涉及java正則匹配與字符串操作的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下 ...

    懶蘿卜4032019-12-29
  • JAVA教程java多線程編程之join方法的使用示例

    java多線程編程之join方法的使用示例

    join方法的功能就是使異步執行的線程變成同步執行。也就是說,當調用線程實例的start方法后,這個方法會立即返回,如果在調用start方法后后需要使用一...

    java技術網4752019-11-04
  • JAVA教程Javafx簡單實現【我的電腦資源管理器】效果

    Javafx簡單實現【我的電腦資源管理器】效果

    這篇文章主要介紹了Javafx簡單實現【我的電腦資源管理器】效果,涉及Javafx操作系統文件模擬資源管理器的實現技巧,具有一定參考借鑒價值,需要的朋友可以...

    21paradox3712020-01-05
  • JAVA教程java 抓取網頁內容實現代碼

    java 抓取網頁內容實現代碼

    這篇文章主要介紹了java 抓取網頁內容實現代碼,需要的朋友可以參考下 ...

    java教程網4212019-11-11
  • JAVA教程JDK8接口的默認與靜態方法-接口與抽象類的區別詳解

    JDK8接口的默認與靜態方法-接口與抽象類的區別詳解

    這篇文章主要介紹了JDK8接口的默認與靜態方法-接口與抽象類的區別詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價...

    java菲3462019-06-29
  • JAVA教程Java線程的控制詳解

    Java線程的控制詳解

    這篇文章主要介紹了Java中的join線程、后臺線程、線程睡眠、線程讓步以及線程的優先級,非常的詳細,希望能對大家有所幫助 ...

    hebedich3572019-12-04
  • JAVA教程java字符串求并集的方法

    java字符串求并集的方法

    這篇文章主要介紹了java字符串求并集的方法,涉及Java字符串操作中union方法的使用,是Java字符串操作中非常實用的基本技巧,需要的朋友可以參考下 ...

    shichen20144282019-12-06
主站蜘蛛池模板: 天天做天天爱天天爽综合网 | 万域之王动漫在线观看全集免费播放 | 91制片厂制作传媒网站 | 99re这里只有精品在线观看 | 攻插受 | 天天操夜夜操狠狠操 | 日本xxxx19| 亚洲精品福利你懂 | www亚洲色图 | 五月性 | 狠狠色狠狠色综合婷婷tag | 国产成人精品免费视频大全五级 | 青久久| 韩剧消失的眼角膜免费完整版 | 风间由美在线播放 | 欧美丝袜foot job | 黑人k8经典| 欧美大美bbb和大白屁股 | 国产剧情麻豆刘玥视频 | 色综合久久综精品 | 亚裔maricahase和黑人 | 精品99一区二区三区麻豆 | 成人一级黄色大片 | 亚洲AV国产精品无码精 | 操老逼| 久久香蕉国产免费天天 | 亚洲天堂2015| 国产hd老太婆 | 欧美a一片xxxx片与善交 | 青丝视频免费版在线看 | 人人爱天天做夜夜爽88 | 免费国产一级观看完整版 | 久久精品中文騷妇女内射 | 久青草国产在视频在线观看 | 色综合欧美色综合七久久 | 公妇乱淫在线播放免费观看 | 火影忍者羞羞 | 男公厕里同性做爰 | 亚洲AV中文字幕无码久久 | 暖暖的免费观看高清视频韩国 | 亚洲精品久久久WWW游戏好玩 |