Nói chung là bài 17 có ví dụ c
volatile
, nó nói nếu isCancel
không dùng biến volatile
thì đổi giá trị của biến này từ thread khác thì người khác sẽ không biết về nó, mình viết lại ví dụ thôi trong phương thức, run
tên của luồng và giá trị được hiển thị isCancel
và hóa ra là bất kể biến có hiện diện volatile
hay không, giá trị vẫn thay đổi cho tất cả các luồng, ngay cả khi bạn gõ, tôi hoàn toàn bối rối; nếu tôi đã tìm ra cách đồng bộ hóa, sau đó tôi volatile
bối rối và không thể áp dụng nó theo bất kỳ cách nào. Có lẽ tôi đã tạo sai ví dụ nào đó? Mình cũng đã thử tạo một lớp Clock
và kế thừa từ Thread
, main
tạo hai instance và chạy cả hai, cũng volatile
không được, giúp mình với, nếu không thì điên mất)
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