بشكل عام يوجد مثال 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