Avatar
0
Tú Đình Beginner
Tú Đình Beginner
Xin hỏi về volatile trong xử lí đa luồng java
Em chào a, e là Tú, e có biết nhóm Unity ạ. E đang đọc và thực hiện lại 1 số ví dụ của a trong trang này của a <span style="vertical-align: inherit"><span style="vertical-align: inherit">https://tvd12.com/volatile-and-atomic/</span></span> . Em đang bị đánh giá ở phần VolatileVí dụ khi em thử bỏ qua biến biến trong biến hoạt động thì luồng 2 của em vẫn hoạt động bình thường, e không hiểu tại sao, mong a chỉ dẫn
  • Answer
threadjava
Remain: 5
2 Answers
Avatar
monkey Beginner
monkey Beginner
ý em là code thế này:

private boolean active;

public void prepare() throws InterruptedException {
    new Thread(() -> {
        System.out.println("application preparing ...");
        sleep(3);
        active = true;
    })
        .start();
}

public void start() throws Exception {
    new Thread(() -> {
        while(!active);
        System.out.println("application started");
    })
        .start();
}

Nó vẫn in được application started đúng không em?

  • 1
  • Reply
vâng đúng rồi a,  –  Tú Đình 1631829650000
vâng đúng rồi a,  –  Tú Đình 1631850786000
Avatar
Tú Đình Beginner
Tú Đình Beginner
package dev.ozudo.volatile_atomic;

public class VolatileExample
{
    private  boolean active;

    public  void prepare() throws  InterruptedException{
        new Thread(()->{
            System.out.println("application preparing");
            System.out.println("name = "+Thread.currentThread().getName());
            sleep(5);
            active = true;
        }).start();
    }

    public  void start() throws Exception{
        new Thread(()->{
            long time = System.currentTimeMillis();
            while (!active){
               // System.out.println("application started");
            }
            if(active){
                System.out.println("name = "+Thread.currentThread().getName());
                System.out.println("stop app = "+(System.currentTimeMillis()-time));
            }
        }).start();
    }
    public  void start2() throws Exception{
        new Thread(()->{
            long time = System.currentTimeMillis();
            while (!active){
                // System.out.println("application started");
            }
            if(active){
                System.out.println("name = "+Thread.currentThread().getName());
                System.out.println("stop app 2222 = "+(System.currentTimeMillis()-time));
            }
        }).start();
    }

    private  static  void  sleep(int seconds){
        try {
            Thread.sleep(seconds*1000);
        } catch (InterruptedException e){
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws  Exception {
        VolatileExample example  = new VolatileExample();
        example.prepare();
        example.start();
        example.start2();
        sleep(1);
    }
}
  • 0
  • Reply
kết quả của em :

application preparing

name = Thread-0

name = Thread-1

name = Thread-2

stop app = 5008

stop app 2222 = 5008

Process finished with exit code 0

 –  Tú Đình 1631829693000
do em có thêm dòng System.out.println("name = "+Thread.currentThread().getName()); em ạ. Anh cũng chưa tìm hiểu sâu về bên trong xem thằng volatile nó làm gì, nhưng theo một số bạn bè của anh giải thích thì khi em dùng cái lệnh System.out thì nó làm cho cái thanh ghi nó bị đầy, và sau khi chạy xong thì nó nạp lại cái giá trị active đã thay đổi vào thanh ghi và thread có vòng while nó nhận được sự thay đổi đó. Tuy nhiên nó đúng với C, còn với Java cần kiểm chứng thêm em nhé.  –  tvd12 1631834368000
Vâng em cảm ơn a  –  Tú Đình 1631912252000