การจำลองการใช้งานคลาส ThreadLocal: ตัวแปรที่ใช้ร่วมกันภายในช่วงเธรดแต่ละเธรดสามารถเข้าถึงเขาได้เท่านั้นและไม่สามารถเข้าถึงเธรดอื่นได้
แพ็คเกจ com.ljq.test.thread; นำเข้า java.util.hashmap; AB MODULE * @Author Administrator * * */Public Class Threadscopesharedata {// จัดทำข้อมูล INT แบบคงที่ส่วนตัวที่ใช้ร่วมกัน = 0; <เธรด, จำนวนเต็ม> (); โมฆะคงที่สาธารณะ (สตริง [] args) {// เริ่มสองเธรดสำหรับ (int i = 0; i <2; i ++) {เธรดใหม่ // ตอนนี้แก้ไขข้อมูลในเธรดปัจจุบันให้ข้อมูลการปรับเปลี่ยนข้อมูล int = new Random () .OUT.PRINTLN (เธรด. ;}} คลาสสแตติก A {โมฆะสาธารณะ Get () {int data = threadData.get (thread.currentthread ()); โมฆะสาธารณะ Get () {int data = threaddata.get (thread.currentthread ());
เรียกใช้ผลลัพธ์:
บทบาทและวัตถุประสงค์ของ Threadlocal:
สำหรับการแบ่งปันข้อมูลในเธรดนั่นคือสำหรับรหัสโปรแกรมเดียวกันจะต้องใช้ร่วมกันหลายโมดูลเมื่อทำงานในเธรดเดียวกันและข้อมูลอื่นจะถูกแชร์เมื่อทำงานในเธรดอื่น
แต่ละเธรดเรียกวิธีการตั้งค่าของวัตถุ ThreadLocal ทั่วโลกซึ่งเทียบเท่ากับการเพิ่มบันทึกลงในแผนที่ภายใน ในตอนท้ายของเธรดคุณสามารถเรียกใช้เมธอด threadlocal.clear () เพื่อให้หน่วยความจำจะถูกปล่อยออกมาเร็วขึ้นและมันก็โอเคที่จะเรียกมันเพราะเธรดยังสามารถปล่อยตัวแปร ThreadLocal ที่เกี่ยวข้องโดยอัตโนมัติ
สถานการณ์แอปพลิเคชันของ ThreadLocal:
การประมวลผลคำสั่งซื้อมีชุดการดำเนินงาน: ลดสินค้าคงคลังเพิ่มบัญชีที่กำลังทำงานและแก้ไขบัญชีทั่วไป มิฉะนั้นการดำเนินการทั้งหมดจะถูกส่งซึ่งกำหนดให้การดำเนินการเหล่านี้ใช้วัตถุการเชื่อมต่อฐานข้อมูลเดียวกันและรหัสของการดำเนินการเหล่านี้อยู่ในคลาสโมดูลที่แตกต่างกัน
การโอนเงินของธนาคารรวมถึงชุดการดำเนินงาน: ลดยอดคงเหลือของการโอนออกจากบัญชีและเพิ่มยอดคงเหลือของการโอนไปยังบัญชี การถ่ายโอนการดำเนินการรหัสเป็นวิธีการของวัตถุบัญชีสองรายการที่แตกต่างกัน
ตัวอย่างเช่น ActionContext ของ strut2 เมื่อมีการเรียกรหัสเดียวกันและเรียกใช้โดยเธรดที่แตกต่างกันข้อมูลที่ดำเนินการโดยรหัสนี้คือสถานะและข้อมูลของแต่ละเธรด เธรดไม่ว่าจะเรียกเมธอด getContext กี่ครั้งและวิธี getContext ที่โมดูลที่โมดูลเหมือนกัน
กรณีทดลอง: กำหนดตัวแปร ThreadLocal ที่ใช้ร่วมกันทั่วโลกแล้วเริ่มเธรดหลายตัวเพื่อเก็บค่าสุ่มไปยังตัวแปร ThreadLocal จากนั้นเรียกใช้วิธีอื่น ๆ ของหมวดหมู่อื่น ๆ คุณจะเห็นว่าหลายคลาสแบ่งปันข้อมูลเดียวกันในเธรดเดียวกัน
ในการห่อหุ้มตัวแปร ThreadLocal เพื่อให้โลกภายนอกไม่ควรใช้งานตัวแปร ThreadLocal โดยตรง
แอปพลิเคชันนี้ค่อนข้างหายากสำหรับบรรจุภัณฑ์ประเภทข้อมูลพื้นฐาน
บรรจุภัณฑ์ของข้อมูลประเภทวัตถุเป็นเรื่องธรรมดามากขึ้นนั่นคือให้คลาสที่แน่นอนสร้างวัตถุอินสแตนซ์อิสระสำหรับเธรดที่แตกต่างกัน
แพ็คเกจ com.ljq.test.thread; นำเข้า Java.util.random; ให้วัตถุอินสแตนซ์ <2; i ++) {เธรดใหม่ (ใหม่ runnable () () {@Override โมฆะสาธารณะเรียกใช้ () {int data = new Random (). nextint (); system.out.println (thread.currentthread () ; "ชื่อ"); วิธีการที่สอดคล้องกันคลาส A {โมฆะสาธารณะ Get () {int data = x.get (); ); /* mythreadscopedata mydata = mythreadscopedata.get (); .getage ()); "," + myData.getage ());}} // ใช้วิธีการที่สอดคล้องกันคลาสสแตติก b {โมฆะสาธารณะ get () {int data = x .get (); .Currenthread () getMyData: " + myData.getName () +", " + myData.getage ()); rivate mythreadscopedata () {} // ให้วิธีการอินสแตนซ์อย่าเพิ่มคำหลักที่ซิงโครไนซ์เพื่อระบุว่าเธรดใช้ข้อมูลของตัวเอง และไม่รบกวนกันและกัน ชุดข้อมูลในช่วงเธรดปัจจุบัน threadlocal <mythreadscopedata> map = new Threadlocal <mythreadscopeedata> (); .name = name;} public int getage () {return age;} การตั้งค่าโมฆะสาธารณะ (อายุ int) {this.age = age;}}}}