ตามชื่อที่แนะนำคำหลักที่ซิงโครไนซ์จะใช้เพื่อซิงโครไนซ์การยกเว้นซึ่งกันและกัน
ที่นี่ฉันจะบันทึกการใช้งานและความสำคัญสั้น ๆ :
1. เมื่อซิงโครไนซ์แก้ไขวิธีนี้หรือวิธีที่ไม่คงที่หรืออินสแตนซ์ล็อคที่ซิงโครไนซ์จะถูกเพิ่มลงในการอ้างอิงวัตถุนี้หรืออินสแตนซ์ ตัวอย่างเช่น A และ B เป็นวัตถุอินสแตนซ์ของคลาสหลัก การเรียกใช้วิธีการซิงโครไนซ์และ B เรียกวิธีการซิงโครไนซ์และไม่ได้เป็นแบบพิเศษร่วมกัน อย่างไรก็ตามวิธีการที่ซิงโครไนซ์การเรียกวัตถุจากเธรดที่แตกต่างกันนั้นไม่เกิดร่วมกัน
โมฆะแบบซิงโครไนซ์สาธารณะ () {// …. } วิธีโมฆะสาธารณะ () {ซิงโครไนซ์ (นี่) {// … .. }}2. แตกต่างจาก 1 เมื่อซิงโครไนซ์ปรับเปลี่ยนชื่อคลาสคลาสหรือวิธีการคงที่แม้แต่วัตถุที่แตกต่างกันก็จะสร้างสิ่งพิเศษร่วมกัน
คลาส Main {public synchronized static void method1 () {// …. } โมฆะสาธารณะวิธีการ 2 () {ซิงโครไนซ์ (main.class) //}} 3.eg:
แพ็คเกจ com.asiainfolinkage.ems.web.controller.base; นำเข้า java.math.biginteger; นำเข้า java.util.date; นำเข้า java.util.hashmap; นำเข้า java.util.map; นำเข้า java.util.random; นำเข้า javax.servlet.http.httpservletrequest; นำเข้า Javax.servlet.http.httpsession; / *** คอนโทรลเลอร์ที่มีโทเค็น* @version 1.0 ลิขสิทธิ์ 29 กรกฎาคม 2013 เวลา 3:38:30 น.*/ คลาสนามธรรมสาธารณะ Tokenbasecontroller ขยาย Basecontroller {แผนที่คงที่ส่วนตัว / ** สร้างโทเค็นที่มีค่าที่ไม่ซ้ำกัน*/ สตริงสาธารณะ GenerateGuid (เซสชัน httpsession) {สตริงโทเค็น = ""; วันที่วันที่ = วันที่ใหม่ (); ซิงโครไนซ์ (SpringMVC_Token) {ลอง {Object OBJ = Session.getAttribute (ค่าคงที่ SPRING_MVC_TOKENNAME); if (obj! = null) springmvc_token = (แผนที่ <string, string>) session.getAttribute (ค่าคงที่ spring_mvc_tokenname); โทเค็น = ใหม่ BigInteger (165, ใหม่สุ่ม ()). TOSTRING (36) .touppercase (); SpringMVC_Token.put (ค่าคงที่ default_token_name + "." + โทเค็นโทเค็น); session.setAttribute (ค่าคงที่ spring_mvc_tokenname, springmvc_token); ค่าคงที่ token_value = โทเค็น; } catch (unglegalStateException e) {_log.error ("generateguid () mothod ค้นหาข้อผิดพลาดโดยเซสชันโทเค็น ... "); }} กลับมาโทเค็น; } / ** ตรวจสอบว่าค่าโทเค็นแบบฟอร์มและค่าโทเค็นในเซสชันนั้นสอดคล้องกัน* / บูลีนสาธารณะ ValidToken (คำขอ httpservletRequest) {string inputToken = getInputToken (คำขอ); if (inputToken == null) {_log.warn ("โทเค็นไม่ถูกต้อง! inputToken เป็น null"); กลับเท็จ; } httpsession session = request.getSession (); แผนที่ <string, string> tokenMap = (แผนที่ <สตริง, สตริง>) เซสชัน. getAttribute (ค่าคงที่. spring_mvc_tokenname); if (tokenmap == null || tokenmap.size () <1) {_log.warn ("โทเค็นไม่ถูกต้อง! sessiontoken เป็น null"); กลับเท็จ; } string sessionToken = toKenMap.get (ค่าคงที่ default_token_name + "." + inputToken); if (! inputToken.equals (sessionToken)) {_log.warn ("โทเค็นไม่ถูกต้อง! inputToken = '" + inputToken + "', sessionToken = '" sessionToken + "'"); กลับเท็จ; } tokenmap.remove (ค่าคงที่ default_token_name + "." + inputtoken); session.setAttribute (ค่าคงที่ SPRING_MVC_TOKENNAME, TOKENMAP); กลับมาจริง; } / ** รับค่าโทเค็นในแบบฟอร์ม* / สตริงส่วนตัว getInputToken (คำขอ httpservletRequest) {map params = request.getParameterMap (); if (! params.containskey (ค่าคงที่ default_token_name)) {_log.warn ("ไม่พบชื่อโทเค็นใน params"); คืนค่า null; } string [] tokens = (string []) (string []) params.get (constants.default_token_name); if ((tokens == null) || (tokens.length <1)) {_log.warn ("มีชื่อโทเค็นว่างหรือว่างเปล่า"); คืนค่า null; } ส่งคืนโทเค็น [0]; -