Nói về biến volatile trong Java – Hướng Dẫn Java

Biến volatile trong Java có tác dụng thông báo sự thay đổi giá trị của biến tới các thread khác nhau nếu biến này đang được sử dụng trong nhiều thread.

Để các bạn có thể hiểu rõ hơn, mình đã làm một ví dụ như sau:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

public

class

VolatileExample

{

 

    

private

volatile

static

int

COUNT

=

0

;

 

    

public

static

void

main

(

String

[

]

args

)

{

        

new

ChangeListener

(

)

.

start

(

)

;

        

new

ChangeMaker

(

)

.

start

(

)

;

    

}

 

    

static

class

ChangeListener

extends

Thread

{

        

@Override

        

public

void

run

(

)

{

            

int

value

=

COUNT

;

            

// Khi giá trị của biến COUNT nhỏ hơn 5, thread này sẽ lặp mãi mãi để kiểm tra giá trị của biến này

            

while

(

value

<

5

)

{

                

if

(

value

!

=

COUNT

)

{

                    

System

.

out

.

println

(

“Count variable changed to : “

+

COUNT

)

;

                    

value

=

COUNT

;

                

}

            

}

        

}

    

}

 

    

static

class

ChangeMaker

extends

Thread

{

        

@Override

        

public

void

run

(

)

{

            

int

value

=

COUNT

;

            

while

(

COUNT

<

5

)

{

                

System

.

out

.

println

(

“Increasing value of count variable to “

+

(

value

+

1

)

)

;

                

COUNT

=

++

value

;

                

try

{

                    

Thread

.

sleep

(

500

)

;

                

}

catch

(

InterruptedException

e

)

{

                    

e

.

printStackTrace

(

)

;

                

}

            

}

        

}

    

}

}

Trong ví dụ này, mình có hai thread đang sử dụng giá trị của biến COUNT, thread thứ nhất (ChangeMaker) có tác dụng thay đối giá trị của biến COUNT, còn thread thứ hai (ChangeListener) sẽ lắng nghe sự thay đổi đó. Biến COUNT sẽ được khai báo là biến volatile để có thể thông báo được sự thay đổi của nó tới thread ChangeListener.
Kết quả:

1

2

3

4

5

6

7

8

9

10

Increasing

value

of

count

variable

to

1

Count

variable

changed

to

:

1

Increasing

value

of

count

variable

to

2

Count

variable

changed

to

:

2

Increasing

value

of

count

variable

to

3

Count

variable

changed

to

:

3

Increasing

value

of

count

variable

to

4

Count

variable

changed

to

:

4

Increasing

value

of

count

variable

to

5

Count

variable

changed

to

:

5

Như các bạn thấy, mỗi khi giá trị của biến COUNT thay đổi thì thread ChangeListener sẽ cập nhập sự thay đổi đó liền.

Nếu bây giờ mình bỏ khai báo biến COUNT là biến volatile đi, thì kết quả sẽ như sau:

1

2

3

4

5

6

Increasing

value

of

count

variable

to

1

Count

variable

changed

to

:

1

Increasing

value

of

count

variable

to

2

Increasing

value

of

count

variable

to

3

Increasing

value

of

count

variable

to

4

Increasing

value

of

count

variable

to

5

Rõ ràng, thread ChangeListener sẽ không thể cập nhập sự thay đổi giá trị của biến COUNT nữa, và do đó chương trình của chúng ta sẽ chạy mãi mãi.

4.6/5 – (9 bình chọn)