โดยทั่วไปมีตัวอย่าง c ในการบรรยายที่ 17 บอกว่าถ้า ไม่ได้ใช้
volatile
ตัวแปรแล้วเปลี่ยนค่าของตัวแปรนี้จากเธรดอื่น คนอื่นจะไม่ทราบเกี่ยวกับมัน ฉันเขียนตัวอย่างใหม่เท่านั้น ในวิธีการจะแสดงชื่อของเธรดและค่าและปรากฎว่าไม่ว่าจะมีตัวแปรอยู่หรือไม่ก็ตามค่ายังคงเปลี่ยนแปลงสำหรับโฟลว์ทั้งหมดแม้ว่าคุณจะเคาะฉันก็สับสนโดยสิ้นเชิง ถ้าฉัน เมื่อรู้การซิงโครไนซ์แล้วฉันก็สับสนและไม่สามารถนำไปใช้ในทางใดทางหนึ่งได้ บางทีฉันอาจสร้างตัวอย่างผิดไปหรือเปล่า? ฉันพยายามสร้างคลาสและสืบทอดจากและสร้างสองอินสแตนซ์แล้วรันทั้งคู่ แต่มันก็ไม่ได้ผล ช่วยฉันด้วย ไม่อย่างนั้นฉันจะบ้าไปแล้ว) isCancel
volatile
run
isCancel
volatile
volatile
Clock
Thread
main
volatile
public static void main(String[] args)
{
Clock n = new Clock();
Thread thread1 = new Thread(n);
Thread thread2 = new Thread(n);
thread1.start();
thread2.start();
try
{
Thread.sleep(3000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
n.cancel();
}
public static class Clock implements Runnable
{
private volatile boolean isCancel = false;
public void cancel()
{
this.isCancel = true;
}
@Override
public void run()
{
while (true)
{
try
{ System.out.println(Thread.currentThread().getName()+" "+isCancel);
Thread.sleep(2000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
GO TO FULL VERSION