באופן כללי, יש דוגמה 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