2016-08-09 15 views
5

Vì lớp Integer cũng là lớp không thay đổi và chúng ta biết rằng lớp không thay đổi là an toàn cho luồng là nhu cầu của Integer nguyên tử. Tôi bối rối. Đó là lý do mà đọc và viết các đối tượng bất biến không cần phải là nguyên tử trong khi đọc và viết số nguyên nguyên tử là nguyên tử. Điều đó có nghĩa là các lớp nguyên tử cũng an toàn với luồng.Sự khác biệt giữa Integer nguyên tử và lớp Integer không thay đổi bình thường trong Java là gì?

+0

nên sử dụng lớp nào khi ?? – user18424

+3

Vâng, một là có thể thay đổi được, cái bất biến khác. Vì vậy, bạn * có thể * sử dụng 'AtomicInteger' khi bạn cần một giá trị có thể thay đổi (các tùy chọn khác tồn tại), bạn không thể sử dụng' Integer'. –

+1

Bạn có thể sử dụng 'AtomicInteger' khi bạn cần giá trị có thể thay đổi ** an toàn **, không chỉ giá trị có thể thay đổi được ... – Eduen

Trả lời

0

Hãy xem xét một biến

int myInt = 3; 

AtomicInteger liên quan đến myInt.

Integer liên quan đến 3.

nói cách khác, biến của bạn có thể thay đổi và có thể thay đổi giá trị của nó. Trong khi giá trị 3 là một chữ số nguyên, một hằng số, một biểu thức bất biến.

Số nguyên là biểu diễn đối tượng của chữ và do đó không thay đổi, về cơ bản bạn chỉ có thể đọc chúng.

AtomicIntegers là các vùng chứa cho các giá trị đó. Bạn có thể đọc và đặt chúng. Giống như gán giá trị cho biến. Nhưng khác với việc thay đổi giá trị của biến số int, hoạt động trên AtomicInteger là nguyên tử.

Ví dụ này không phải là nguyên tử

if(myInt == 3) { 
    myInt++; 
} 

Đây là nguyên tử

AtomicInteger myInt = new AtomicInteger(3); 

//atomic 
myInt.compareAndSet(3, 4); 
+0

Trong khi câu trả lời này dường như chứa đựng ý chính của nó, một 'AtomicInteger' không thể tham chiếu đến biến' int', vì vậy ví dụ của bạn trên 3 dòng đầu tiên chỉ là khó hiểu. – Kayaman

+0

xin lỗi, tôi không có người bản ngữ, tôi không có nghĩa là tham khảo như trong "tham khảo java" nhưng nhiều hơn trong ý nghĩa của "sữa đề cập đến bò như whool đề cập đến cừu", nhưng có thể "tham khảo" không phải là từ đúng trong đó trường hợp, sẽ "liên quan" được tốt hơn? –

+0

Có, rõ ràng hơn rất nhiều. – Kayaman

2

Trong khi đối tượng bất biến là thread-safe theo định nghĩa, các đối tượng có thể thay đổi thể được chủ đề an toàn quá.

Đó chính xác là mục đích của các lớp học Atomic... (AtomicInteger, AtomicBoolean, v.v.).

Các phương pháp ...get......set... khác nhau cho phép truy cập an toàn chủ đề và đột biến đối tượng.

Không ngạc nhiên khi lớp được khai báo trong gói java.util.concurrent.

Bạn chỉ cần duyệt API cho gói java.util.concurrent.atomic:

Một bộ công cụ nhỏ của các lớp học có hỗ trợ lock-free lập trình thread-an toàn trên biến duy nhất.

+0

Lớp nguyên tử nên có hiệu suất tốt hơn so với các lớp bao bọc không thay đổi được Tôi nghĩ rằng – user18424

+3

@ user18424 Vì bạn không thể sử dụng chúng cho cùng một mục đích, bạn nghĩ sai. Không có cách nào hợp lý để so sánh hiệu suất giữa hai lớp đó. – Kayaman

+0

@ user18424 không thực sự. Trong một bối cảnh đơn luồng, bạn muốn dính vào 'Số' thực sự. Tất cả phụ thuộc vào cách sử dụng. – Mena

0

AtomicInteger là chủ đề an toàn (trên thực tế, tất cả các lớp từ gói java.util.concurrent.atomic đều an toàn), trong khi các số nguyên bình thường KHÔNG an toàn.

Bạn sẽ require 'đồng bộ' & từ khóa 'bay hơi', khi bạn đang sử dụng biến một 'Integer' trong môi trường đa luồng (để làm cho nó chủ đề an toàn) nơi như với số nguyên nguyên tử bạn không cần phải 'đồng bộ Từ khóa '&' dễ bay hơi 'làm số nguyên nguyên tử đảm bảo an toàn luồng.

Ngoài ra, tôi muốn giới thiệu các hướng dẫn dưới đây hữu ích về cùng một chủ đề: http://tutorials.jenkov.com/java-concurrency/compare-and-swap.html

Vui lòng tham khảo dưới đây oracle doc để biết thêm thông tin về gói 'nguyên tử': https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/package-summary.html

+0

Lớp Integer thông thường là bất biến và cũng an toàn thread – user18424

+0

Integer thông thường là chỉ an toàn khi bạn sử dụng cùng với các từ khóa 'đồng bộ hóa' và 'dễ bay hơi'. – developer

+0

@developer Integer là không thay đổi và do đó là an toàn theo chủ đề theo mặc định, không cần đồng bộ hoặc dễ bay hơi. Tuy nhiên, nhược điểm của bất biến là giá trị không bao giờ có thể thay đổi. Nếu bạn cần giá trị thay đổi, hãy sử dụng AtomicInteger hoặc một số phương thức khác hoặc từ khóa dễ bay hơi/được đồng bộ hóa. – puhlen

2

AtomicInteger được sử dụng trong các môi trường đa luồng khi bạn cần đảm bảo rằng chỉ một luồng có thể cập nhật biến int. Ưu điểm là không có đồng bộ hóa bên ngoài được requried kể từ khi các hoạt động mà sửa đổi giá trị của nó được thực hiện một cách an toàn thread.

xem xét mã followind:

private int count; 

public int updateCounter() { 
    return ++count; 
} 

Nếu có nhiều chủ đề sẽ gọi phương thức updateCounter, nó có thể là một số trong số họ sẽ nhận được giá trị tương tự. Lý do khiến hoạt động đếm số liệu không phải là nguyên tử vì không chỉ là một phép toán mà còn được thực hiện từ ba hoạt động: read count, add 1 to it's value and write it back to it. Nhiều chuỗi cuộc gọi có thể thấy biến chưa được sửa đổi thành giá trị mới nhất của nó.

Đoạn mã trên nên được thay thế với điều này:

private AtomicInteger count = new AtomicInteger(0); 
public int updateCounter() { 
    return count.incrementAndGet(); 
} 

Phương pháp incrementAndGet được đảm bảo nguyên tử tăng giá trị được lưu trữ và trả lại giá trị của nó mà không sử dụng bất kỳ synchonization bên ngoài.

Nếu giá trị của bạn không bao giờ thay đổi, bạn không phải sử dụng AtomicInteger, nó đủ để sử dụng int.

Các vấn đề liên quan