ใน Java คำหลักที่ซิงโครไนซ์และล็อคล็อคใช้เพื่อตระหนักถึงการควบคุมการเข้าถึงทรัพยากรที่เกิดขึ้นพร้อมกัน เฉพาะเธรดที่ไม่ซ้ำกันเท่านั้นที่ได้รับอนุญาตให้เข้าสู่พื้นที่วิกฤตเพื่อเข้าถึงทรัพยากร (ยกเว้นการอ่านล็อค) วัตถุประสงค์หลักของการควบคุมย่อยนี้คือการแก้ปัญหาความไม่สอดคล้องกันของข้อมูลที่เกิดจากหลายเธรดพร้อมกันกับทรัพยากรเดียวกัน ในสถานการณ์อื่นทรัพยากรมีหลายสำเนาสำหรับใช้ในเวลาเดียวกันเช่นเครื่องพิมพ์หลายเครื่องในห้องเครื่องพิมพ์และหลายหลุมสำหรับใช้ในเวลาเดียวกัน ในกรณีนี้ Java ให้การควบคุมการเข้าถึงที่เกิดขึ้นพร้อมกันอีกครั้ง - การควบคุมการเข้าถึงที่เกิดขึ้นพร้อมกันสำหรับทรัพยากรหลายชุดและสัญญาณที่ใช้ในวันนี้เป็นหนึ่งในนั้น
Java สามารถตรวจจับปัญหาความปลอดภัยของด้ายที่อาจเกิดขึ้นในระบบของเราในวิธีที่เร็วที่สุดผ่านการจำลองรหัส ที่นี่ semaphore (semaphore) และ countdownlatch (ล็อค) ใช้กับ ExecutorService (เธรดพูล) สำหรับการจำลอง การแนะนำหลักมีดังนี้:
1. semaphore
คลาสนี้จะได้รับหลังจาก JDK 1.5
Semaphore เป็นสัญญาณที่อิงกับนับ มันสามารถตั้งค่าเกณฑ์ตามนี้หลายเธรดแข่งขันเพื่อรับสัญญาณใบอนุญาตและส่งคืนหลังจากทำแอปพลิเคชันของตนเอง หลังจากเกินขีด จำกัด แอปพลิเคชันของเธรดสำหรับสัญญาณใบอนุญาตจะถูกบล็อก Semaphore สามารถใช้ในการสร้างพูลวัตถุบางส่วนพูลทรัพยากร ฯลฯ เช่นพูลเชื่อมต่อฐานข้อมูล นอกจากนี้เรายังสามารถสร้างเซมาฟอร์ด้วยจำนวน 1 โดยใช้เป็นกลไกที่คล้ายกับล็อค Mutex สิ่งนี้เรียกอีกอย่างว่าสัญญาณไบนารีแสดงให้เห็นสองสถานะ mutex
2. Countdownlatch
คลาสนี้จะได้รับหลังจาก JDK 1.5
คลาส Countdownlatch สามารถทำให้เธรดรอให้เธรดอื่นทำงานให้เสร็จสมบูรณ์ก่อนที่จะดำเนินการ ตัวอย่างเช่นเธรดหลักของแอปพลิเคชันต้องการดำเนินการหลังจากเธรดที่รับผิดชอบในการเริ่มต้นบริการเฟรมเวิร์กได้เริ่มต้นบริการเฟรมเวิร์กทั้งหมด
Countdownlatch ถูกนำไปใช้ผ่านตัวนับและค่าเริ่มต้นของตัวนับคือจำนวนเธรด เมื่อใดก็ตามที่เธรดทำงานของตัวเองเสร็จสิ้นค่าตัวนับจะลดลง 1 เมื่อค่าตัวนับถึง 0 หมายความว่าเธรดทั้งหมดเสร็จสิ้นงานแล้วเธรดที่รอการล็อคสามารถดำเนินการต่อการดำเนินการของงานได้
ดังที่แสดงในรูปด้านล่าง:
สองคลาสข้างต้นสามารถใช้ร่วมกันเพื่อให้ได้ผลของการจำลองการเกิดขึ้นพร้อมกันสูง รหัสต่อไปนี้ใช้เพื่อยกตัวอย่าง:
แพ็คเกจโมดูล; นำเข้า java.util.concurrent.countdownlatch; นำเข้า java.util.concurrent.executorservice; นำเข้า java.util.concurrent.executors; นำเข้า Java.util.concurrent.semaphore; // จำนวนเธรดที่ดำเนินการพร้อมกันในเวลาเดียวกัน public Static int threadtotal = 200; การนับ int คงที่สาธารณะ = 0; โมฆะคงที่สาธารณะหลัก (สตริง [] args) โยนข้อยกเว้น {ExecutoRservice ExecutorService = Executors.newCachedThreadPool (); // เซมิคอนดักเตอร์ใช้เพื่อควบคุมจำนวนเธรดพร้อมกันที่นี่ Semaphore Semaphore = Semaphore ใหม่ (Threadtotal); // การล็อคซึ่งสามารถตระหนักถึงการลดลงของตัวนับ countdownlatch countdownlatch = new Countdownlatch (clienttotal); สำหรับ (int i = 0; i <clienttotal; i ++) {executorService.execute (() -> {ลอง {// ดำเนินการวิธีนี้เพื่อรับสิทธิ์การดำเนินการเมื่อจำนวนใบอนุญาตที่ยังไม่ได้ใช้งานไม่เกิน 200 } catch (exception e) {//log.error("exception ", e); } countdownlatch.await (); // บล็อกเธรดและบล็อกจะไม่ถูกปล่อยออกมาจนกว่าค่าล็อคจะเป็น 0. ดำเนินการต่อเพื่อดำเนินการ ExecutorService.Shutdown (); log.info ("count: {}" นับ); } โมฆะคงที่ส่วนตัวเพิ่ม () {count ++; -ดังที่แสดงในวิธีการข้างต้นมีการจำลองคำขอ 5,000 ครั้งและการดำเนินการพร้อมกัน 200 ครั้งมีการดำเนินการพร้อมกันถึง 200 ครั้งในเวลาเดียวกัน สังเกตผลลัพธ์สุดท้ายและพบว่าผลลัพธ์นั้นแตกต่างกันในแต่ละครั้งและไม่สอดคล้องกับความคาดหวัง ผลลัพธ์มีดังนี้:
22: 18: 26.449 [หลัก] โมดูลข้อมูล. countexample - นับ: 4997
22: 18: 26.449 [หลัก] โมดูลข้อมูล. countexample - นับ: 5000
22: 18: 26.449 [หลัก] โมดูลข้อมูล. countexample - นับ: 4995
22: 18: 26.449 [หลัก] โมดูลข้อมูล. countexample - นับ: 4998
บทสรุปสุดท้าย: วิธีเพิ่มไม่ปลอดภัยเธรด
จากนั้นวิธีการตรวจสอบความปลอดภัยของเธรดของวิธีการเพิ่มแก้ไขวิธีการเพิ่มดังนี้:
โมฆะคงที่ส่วนตัวเพิ่ม () {count.incrementandget ();}ผลการดำเนินการมีดังนี้:
22: 18: 26.449 [หลัก] โมดูลข้อมูล. countexample - นับ: 5000
22: 18: 26.449 [หลัก] โมดูลข้อมูล. countexample - นับ: 5000
22: 18: 26.449 [หลัก] โมดูลข้อมูล. countexample - นับ: 5000
22: 18: 26.449 [หลัก] โมดูลข้อมูล. countexample - นับ: 5000
22: 18: 26.449 [หลัก] โมดูลข้อมูล. countexample - นับ: 5000
22: 18: 26.449 [หลัก] โมดูลข้อมูล. countexample - นับ: 5000
22: 18: 26.449 [หลัก] โมดูลข้อมูล. countexample - นับ: 5000
22: 18: 26.449 [หลัก] โมดูลข้อมูล. countexample - นับ: 5000
บทสรุปสุดท้าย: วิธีเพิ่มวิธีการที่ปลอดภัยของเธรดที่ปลอดภัย
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น