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

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

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
主站蜘蛛池模板: 妇伦小说| 99福利影院 | 十六一下岁女子毛片免费 | 处女呦呦 | 四虎影院网站 | 99久9在线视频 | 色婷婷影院在线视频免费播放 | 免费看一级毛片 | 日韩网站在线 | 把美女屁股眼扒开图片 | 无敌秦墨漫画免费阅读 | 亚洲国产成人在线 | 免费精品国产 | 四虎免费影院在线播放 | 国产精品亚洲综合第一区 | 欧美性白人顶级hd | 人妖欧美一区二区三区四区 | 手机看片福利盒子久久 | 精品一区二区三区中文 | 国产无限免费观看黄网站 | 毛片一级免费 | 国产在线精品亚洲第一区香蕉 | 视频高清在线观看 | 好吊妞视频998www | 成人国产午夜在线视频 | 日韩免费| 成人一区二区丝袜美腿 | 羞羞漫画免费漫画页面在线看漫画秋蝉 | 狠狠狠地啪香蕉 | 我和子伦系列小说 | 久久精品国产欧美日韩99热 | 国产欧美一区二区三区精品 | 免费一级黄 | 精选国产AV精选一区二区三区 | 97成网| 欧美一区二区三区视视频 | 闺蜜调教我做她的脚奴 | 欧美日韩亚洲综合久久久 | 99久久精品国产一区二区 | 国产在线乱子伦一区二区 | 67194在线免费观看 |