Seperti namanya, kata kunci yang disinkronkan digunakan untuk menyinkronkan pengecualian timbal balik.
Di sini saya akan mencatat penggunaan dan signifikansinya secara singkat:
1. Ketika disinkronkan memodifikasi metode ini atau non-statis atau instance, kunci yang disinkronkan ditambahkan ke referensi objek ini atau instance. Misalnya, A dan B keduanya adalah objek instantiated dari kelas utama. A memanggil metode yang disinkronkan, dan B memanggil metode yang disinkronkan, dan tidak membentuk yang saling eksklusif. Namun, metode yang disinkronkan panggilan objek dari utas yang berbeda saling eksklusif.
Metode void yang disinkronkan publik () {//…. } Metode public void () {disinkronkan (ini) {//… ..}}2. Tidak seperti 1, ketika disinkronkan memodifikasi nama kelas. Metode kelas atau statis, bahkan objek yang berbeda akan membentuk eksklusif bersama.
Kelas {public static void method1 () {//…. } public void method2 () {disinkronkan (main.class) //}} 3.EG:
paket com.asiainfolinkage.ems.web.controller.base; impor java.math.biginteger; impor java.util.date; impor java.util.hashmap; impor java.util.map; impor java.util.random; impor javax.servlet.http.httpservletRequest; impor javax.servlet.http.httpsession; / *** Pengontrol dengan token* @Version 1.0 Hak Cipta 29 Juli 2013 pada pukul 3:38:30 PM*/ Kelas Abstrak Publik TokenBaseController memperluas Basecontroller {private static Map <String, String> springmvc_token = hashmap baru <string, string> (); / ** menghasilkan token dengan nilai unik*/ public string generateguid (sesi httpsession) {string token = ""; Tanggal Tanggal = Tanggal Baru (); disinkronkan (springmvc_token) {coba {objek obj = session.getAttribute (constants.spring_mvc_tokenname); if (obj! = null) springmvc_token = (peta <string, string>) session.getAttribute (constants.spring_mvc_tokenname); token = BigInteger baru (165, acak baru ()). ToString (36). ToPpercase (); springmvc_token.put (constants.default_token_name + "." + token, token); session.setAttribute (constants.spring_mvc_tokenname, springmvc_token); Constants.token_value = token; } catch (ilegalstateException e) {_log.error ("generateguid () mothod temukan bug, dengan sesi token ..."); }} return token; } / ** Verifikasi apakah nilai token formulir dan nilai token dalam sesi konsisten* / public boolean validtoken (permintaan httpservletRequest) {string inputToken = getInputToken (permintaan); if (inputToken == null) {_log.warn ("token tidak valid! InputToken adalah null"); mengembalikan false; } Httpsession session = request.getSession (); Peta <string, string> tokenMap = (peta <string, string>) session.getAttribute (constants.spring_mvc_tokenname); if (tokenMap == null || tokenMap.size () <1) {_log.warn ("token tidak valid! sessionToken adalah null"); mengembalikan false; } String sessionToken = tokenMap.get (constants.default_token_name + "." + InputToken); if (! inputToken.equals (sessionToken)) {_log.warn ("token tidak valid! inputToken = '" + inputToken + "', sessionToken = '" + sessionToken + "'"); mengembalikan false; } tokenMap.remove (constants.default_token_name + "." + inputToken); session.setAttribute (constants.spring_mvc_tokenname, tokenMap); Kembali Benar; } / ** Dapatkan nilai token dalam formulir* / private string getInputToken (permintaan httpservletRequest) {peta params = request.getParametermap (); if (! params.containskey (constants.default_token_name)) {_log.warn ("tidak dapat menemukan nama token di params."); kembali nol; } String [] tokens = (string []) (string []) params.get (constants.default_token_name); if ((Tokens == null) || (tokens.length <1)) {_log.warn ("Mendapat nama token nol atau kosong."); kembali nol; } return token [0]; }}