หากไม่สามารถซิงโครไนซ์การเข้าถึงข้อมูลที่ไม่แน่นอนที่ใช้ร่วมกันได้ ผลที่ตามมาอาจเลวร้าย แม้ว่าตัวแปรจะสามารถอ่านและเขียนได้แบบอะตอมมิกก็ตาม
ลองพิจารณาปัญหาการซิงโครไนซ์เธรด สำหรับการซิงโครไนซ์เธรด ไลบรารีคลาส Java จัดเตรียมเมธอด Thread.stop แต่เมธอดนี้ไม่คุ้มค่าที่จะส่งเสริม เนื่องจากมันไม่ปลอดภัยโดยเนื้อแท้ จะดีกว่าถ้าใช้โพลดังเช่นโปรแกรมต่อไปนี้
คัดลอกรหัสรหัส ดังต่อไปนี้:
นำเข้า java.util.concurrent.TimeUnit;
StopThread คลาสสาธารณะ {
-
* @param args
-
ร้องขอการหยุดบูลีนแบบคงที่ส่วนตัว
โมฆะสาธารณะคง main (String [] args)
พ่น InterruptedException{
เธรด backgroundThread = เธรดใหม่ (เรียกใช้ใหม่ () {
@แทนที่
โมฆะสาธารณะวิ่ง () {
int i = 0;
ในขณะที่(!stopRequested){
ฉัน++;
System.out.println(i);
-
-
-
backgroundThread.start();
TimeUnit.SECONDS.sleep(1);
stopRequested = จริง;
-
-
คุณอาจคิดว่าหลังจากที่โปรแกรมนี้ทำงานประมาณหนึ่งวินาที เธรดหลักจะตั้งค่า stopRequested เป็นจริง ทำให้เธรดใหม่ในพื้นหลังหยุดทำงาน จริงๆ แล้วไม่ใช่กรณีนี้ เนื่องจากเธรดพื้นหลังไม่สามารถมองเห็นการเปลี่ยนแปลงนี้ได้ ดังนั้นจึงจะวนซ้ำไปเรื่อยๆ อย่างไม่มีที่สิ้นสุด ซึ่งเป็นผลมาจากการไม่ซิงโครไนซ์ข้อมูล ลองทำพร้อมกันดู
คัดลอกรหัสรหัส ดังต่อไปนี้:
นำเข้า java.util.concurrent.TimeUnit;
StopThread คลาสสาธารณะ {
-
* @param args
-
ร้องขอการหยุดบูลีนแบบคงที่ส่วนตัว
โมฆะการซิงโครไนซ์ส่วนตัวแบบคงที่ requestStop () {
stopRequested = จริง;
-
stopRequested บูลีนแบบซิงโครไนซ์ส่วนตัวแบบคงที่ () {
กลับหยุดร้องขอ;
-
โมฆะสาธารณะคง main (String [] args)
พ่น InterruptedException{
เธรด backgroundThread = เธรดใหม่ (เรียกใช้ใหม่ () {
@แทนที่
โมฆะสาธารณะวิ่ง () {
int i = 0;
ในขณะที่(!stopRequested()){
ฉัน++;
System.out.println(i);
-
-
-
backgroundThread.start();
TimeUnit.SECONDS.sleep(1);
ขอหยุด();
-
-
สิ่งนี้ทำให้สามารถซิงโครไนซ์ข้อมูลได้ เป็นที่น่าสังเกตว่าทั้งวิธีเขียน (requestStop) และวิธีอ่าน (stopRequested) จำเป็นต้องซิงโครไนซ์ ไม่เช่นนั้นจะยังไม่ซิงโครไนซ์ในความหมายที่แท้จริง
นอกจากนี้ เราสามารถใช้ตัวแก้ไขตัวแปรผันผวนเพื่อทำงานการซิงโครไนซ์ให้เสร็จสิ้นได้ง่ายขึ้น
คัดลอกรหัสรหัส ดังต่อไปนี้:
นำเข้า java.util.concurrent.TimeUnit;
StopThread คลาสสาธารณะ {
-
* @param args
-
ร้องขอการหยุดบูลีนแบบคงที่ส่วนตัว
โมฆะสาธารณะคง main (String [] args)
พ่น InterruptedException{
เธรด backgroundThread = เธรดใหม่ (เรียกใช้ใหม่ () {
@แทนที่
โมฆะสาธารณะวิ่ง () {
int i = 0;
ในขณะที่(!stopRequested){
ฉัน++;
System.out.println(i);
-
-
-
backgroundThread.start();
TimeUnit.SECONDS.sleep(1);
stopRequested = จริง;
-
-