Sa pangkalahatan, mayroong isang halimbawa c sa lecture 17
volatile
, sinasabi nito na kung ang isang variable isCancel
ay hindi ginagamit volatile
, pagkatapos ay sa pamamagitan ng pagbabago ng mga halaga ng variable na ito mula sa isa pang thread, hindi malalaman ng iba ang tungkol dito, muling isinulat ko ang halimbawa, lamang sa pamamaraan run
ang pangalan ng thread at ang halaga ay ipinapakita isCancel
at ito ay lumabas na depende sa kung ang variable ay naroroon volatile
o wala, ang halaga ay nagbabago pa rin para sa lahat ng mga daloy, kahit na kumatok ka, ako ay ganap na nalilito; kung ako Naisip ko ang pag-synchronize, pagkatapos ay nalilito ako volatile
at hindi ko mailapat ito sa anumang paraan. Siguro mali ang ginawa kong halimbawa kahit papaano? Sinubukan ko ring lumikha ng isang klase Clock
at magmana mula sa Thread
, at main
lumikha ng dalawang pagkakataon at patakbuhin ang pareho, volatile
hindi rin ito gumana, tulungan mo ako, kung hindi, mababaliw ako)
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