Nguyên tử Vs dễ bay hơi [bản sao]

129
Vaibhav 2013-11-03 07:06.

Tôi đọc ở đâu đó dòng dưới đây.

Từ khóa dễ bay hơi trong Java không có nghĩa là nguyên tử, quan niệm sai lầm phổ biến của nó rằng sau khi khai báo ++hoạt động sẽ là nguyên tử, để tạo nguyên tử hoạt động bạn vẫn cần đảm bảo quyền truy cập độc quyền bằng cách sử dụng synchronizedphương thức hoặc khối trong Java.

Vậy điều gì sẽ xảy ra nếu hai luồng tấn công một volatilebiến nguyên thủy cùng một lúc?

Điều này có nghĩa là bất kỳ ai khóa nó, người đó sẽ đặt giá trị của nó trước tiên. Và nếu trong khi chờ đợi, một số luồng khác xuất hiện và đọc giá trị cũ trong khi luồng đầu tiên đang thay đổi giá trị của nó, thì không phải luồng mới sẽ đọc giá trị cũ của nó?

Sự khác biệt giữa từ khóa Atomic và từ khóa dễ bay hơi là gì?

6 answers

162
Louis Wasserman 2013-11-03 07:08.

Tác dụng của volatiletừ khóa gần như là mỗi thao tác đọc hoặc ghi riêng lẻ trên biến đó là nguyên tử.

Tuy nhiên, đáng chú ý, một hoạt động yêu cầu nhiều hơn một lần đọc / ghi - chẳng hạn như i++, tương đương với i = i + 1, một lần đọc và một lần ghi - không phải là nguyên tử, vì một luồng khác có thể ghi vào igiữa quá trình đọc và ghi.

Các Atomiclớp, như AtomicIntegerAtomicReference, cung cấp nhiều loại hoạt động hơn về mặt nguyên tử, đặc biệt bao gồm cả tăng cho AtomicInteger.

86
TwoThe 2013-11-03 08:20.

Dễ bay hơi và Nguyên tử là hai khái niệm khác nhau. Volatile đảm bảo rằng một trạng thái (bộ nhớ) nhất định là đúng trên các luồng khác nhau, trong khi Atomics đảm bảo rằng hoạt động trên các biến được thực hiện nguyên tử.

Lấy ví dụ sau về hai luồng trong Java:

Chủ đề A:

value = 1;
done = true;

Chủ đề B:

if (done)
  System.out.println(value);

Bắt đầu với value = 0done = falsequy tắc phân luồng cho chúng ta biết rằng không xác định được liệu Luồng B có in giá trị hay không. Hơn nữa, giá trị cũng không được xác định tại thời điểm đó! Để giải thích điều này, bạn cần biết một chút về quản lý bộ nhớ Java (có thể phức tạp), nói ngắn gọn: Các luồng có thể tạo bản sao cục bộ của các biến và JVM có thể sắp xếp lại mã để tối ưu hóa nó, do đó không có gì đảm bảo rằng đoạn mã trên được chạy chính xác theo thứ tự đó. Đặt hoàn tất thành true và sau đó đặt giá trị thành 1 có thể là một kết quả có thể xảy ra của việc tối ưu hóa JIT.

volatilechỉ đảm bảo rằng tại thời điểm truy cập của một biến như vậy, giá trị mới sẽ được hiển thị ngay lập tức cho tất cả các luồng khác thứ tự thực hiện đảm bảo rằng mã ở trạng thái bạn mong đợi. Vì vậy, trong trường hợp của đoạn mã trên, việc xác định donebiến sẽ đảm bảo rằng bất cứ khi nào Luồng B kiểm tra biến, biến đó là sai hoặc đúng và nếu đúng, thì biến đó valuecũng được đặt thành 1.

Như một tác dụng phụ của biến số dễ bay hơi , giá trị của một biến số như vậy được đặt nguyên tử trên toàn bộ chuỗi (với chi phí tốc độ thực thi rất nhỏ). Tuy nhiên, điều này chỉ quan trọng trên các hệ thống 32-bit mà iE sử dụng các biến dài (64-bit) (hoặc tương tự), trong hầu hết các trường hợp khác, việc thiết lập / đọc một biến luôn là nguyên tử. Nhưng có một sự khác biệt quan trọng giữa truy cập nguyên tử và hoạt động nguyên tử. Volatile chỉ đảm bảo rằng truy cập là nguyên tử, trong khi Atomics đảm bảo rằng hoạt động là nguyên tử.

Lấy ví dụ sau:

i = i + 1;

Bất kể bạn định nghĩa i như thế nào, một Thread khác đọc giá trị ngay khi dòng trên được thực thi có thể nhận được i, hoặc i + 1, bởi vì hoạt động không phải là nguyên tử. Nếu luồng khác đặt i thành một giá trị khác, trong trường hợp xấu nhất, tôi có thể được đặt lại thành bất kỳ giá trị nào trước đó bởi luồng A, bởi vì nó chỉ đang ở giữa tính toán i + 1 dựa trên giá trị cũ, rồi đặt i lại về giá trị cũ đó + 1. Giải thích:

Assume i = 0
Thread A reads i, calculates i+1, which is 1
Thread B sets i to 1000 and returns
Thread A now sets i to the result of the operation, which is i = 1

Các nguyên tử như AtomicInteger đảm bảo rằng các hoạt động như vậy diễn ra theo nguyên tử. Vì vậy, vấn đề trên không thể xảy ra, tôi sẽ là 1000 hoặc 1001 khi cả hai chủ đề kết thúc.

69
Trying 2013-11-03 07:22.

Có hai khái niệm quan trọng trong môi trường đa luồng:

  1. tính nguyên tử
  2. hiển thị

Các volatiletừ khóa tận diệt các vấn đề tầm nhìn, nhưng nó không đối phó với số nguyên tử. volatilesẽ ngăn trình biên dịch sắp xếp lại thứ tự các lệnh liên quan đến việc ghi và đọc tiếp theo của một biến dễ bay hơi; vd k++. Đây k++không phải là một lệnh máy duy nhất, mà là ba:

  1. sao chép giá trị vào một thanh ghi;
  2. gia tăng giá trị;
  3. đặt nó trở lại.

Vì vậy, ngay cả khi bạn khai báo một biến là volatile, điều này sẽ không làm cho hoạt động này trở thành nguyên tử; điều này có nghĩa là một luồng khác có thể thấy một kết quả trung gian là giá trị cũ hoặc không mong muốn cho luồng kia.

Mặt khác, AtomicInteger, AtomicReferenceđược dựa trên các hướng dẫn So sánh và hoán đổi . CAS có ba toán hạng: vị trí bộ nhớ Vđể hoạt động, giá trị cũ dự kiến Avà giá trị mới B. CAScập nhật nguyên tử Vlên giá trị mới B, nhưng chỉ khi giá trị trong Vkhớp với giá trị cũ dự kiến A; nếu không, nó không làm gì cả. Trong cả hai trường hợp, nó trả về giá trị hiện tại V. Các compareAndSet()phương pháp AtomicIntegerAtomicReferencetận dụng chức năng này, nếu nó được bộ xử lý bên dưới hỗ trợ; nếu không, thì JVM thực hiện nó thông qua khóa quay .

40
scottb 2013-11-03 08:02.

Như Đang thử như đã chỉ ra, volatilechỉ đề cập đến khả năng hiển thị.

Hãy xem xét đoạn mã này trong một môi trường đồng thời:

boolean isStopped = false;
    :
    :

    while (!isStopped) {
        // do some kind of work
    }

Ý tưởng ở đây là một số luồng có thể thay đổi giá trị isStoppedtừ false thành true để chỉ ra cho vòng lặp tiếp theo rằng đã đến lúc ngừng lặp lại.

Về mặt trực giác, không có vấn đề gì. Về mặt logic, nếu một luồng khác làm isStoppedbằng true, thì vòng lặp phải kết thúc. Thực tế là vòng lặp có thể sẽ không bao giờ kết thúc ngay cả khi một luồng khác làm isStoppedbằng true.

Lý do cho điều này là không trực quan, nhưng hãy xem xét rằng các bộ xử lý hiện đại có nhiều lõi và mỗi lõi có nhiều thanh ghi và nhiều mức bộ nhớ đệm mà các bộ xử lý khác không thể truy cập được . Nói cách khác, các giá trị được lưu vào bộ nhớ đệm trong bộ nhớ cục bộ của một bộ xử lý không thể hiển thị đối với các luồng thực thi trên một bộ xử lý khác. Đây là một trong những vấn đề trung tâm với tính đồng thời: khả năng hiển thị.

Các Java Memory Model không đảm bảo nào về việc khi nào thay đổi được thực hiện cho một biến trong một thread có thể trở thành có thể nhìn thấy chủ đề khác. Để đảm bảo rằng các bản cập nhật có thể nhìn thấy ngay khi chúng được thực hiện, bạn phải đồng bộ hóa.

Các volatiletừ khóa là một hình thức yếu kém của đồng bộ hóa. Mặc dù nó không làm gì để loại trừ lẫn nhau hoặc nguyên tử, nhưng nó cung cấp một đảm bảo rằng các thay đổi được thực hiện đối với một biến trong một chuỗi sẽ hiển thị với các chuỗi khác ngay khi nó được thực hiện. Bởi vì các biến riêng lẻ đọc và ghi vào các biến không phải là 8 byte là nguyên tử trong Java, việc khai báo các biến volatilecung cấp một cơ chế dễ dàng để cung cấp khả năng hiển thị trong các tình huống không có các yêu cầu về tính nguyên tử hoặc loại trừ lẫn nhau.

17
Ortwin Angermeier 2013-11-03 08:22.

Các volatiletừ khóa được sử dụng:

  • để thực hiện các phép toán 64-bit phi nguyên tử: longdouble. (tất cả các truy cập nguyên thủy khác đã được đảm bảo là nguyên tử!)
  • để thực hiện các cập nhật biến được đảm bảo sẽ được các luồng khác nhìn thấy + hiệu ứng hiển thị: sau khi ghi vào một biến biến động, tất cả các biến có thể nhìn thấy trước khi ghi biến đó sẽ hiển thị với một chủ đề khác sau khi đọc cùng một biến biến động (xảy ra trước khi sắp xếp).

Các java.util.concurrent.atomic.*lớp, theo tài liệu java :

Một bộ công cụ nhỏ gồm các lớp hỗ trợ lập trình an toàn luồng không khóa trên các biến đơn. Về bản chất, các lớp trong gói này mở rộng khái niệm về giá trị dễ bay hơi, trường và phần tử mảng cho những phần tử cũng cung cấp hoạt động cập nhật có điều kiện nguyên tử của biểu mẫu:

boolean compareAndSet(expectedValue, updateValue);

Các lớp nguyên tử được xây dựng xung quanh compareAndSet(...)chức năng nguyên tử ánh xạ tới một lệnh CPU nguyên tử. Các lớp nguyên tử giới thiệu thứ tự xảy ra trước khi các volatilebiến làm. (với một ngoại lệ weakCompareAndSet(...):).

Từ tài liệu java:

Khi một luồng nhìn thấy bản cập nhật cho một biến nguyên tử do yếuCompareAndSet gây ra, nó không nhất thiết phải thấy các bản cập nhật cho bất kỳ biến nào khác đã xảy ra trước yếuCompareAndSet.

Đối với câu hỏi của bạn:

Điều này có nghĩa là bất kỳ ai khóa nó, người đó sẽ đặt giá trị của nó trước tiên. Và nếu trong khi chờ đợi, một số luồng khác xuất hiện và đọc giá trị cũ trong khi luồng đầu tiên đang thay đổi giá trị của nó, thì không phải luồng mới sẽ đọc giá trị cũ của nó?

Bạn không khóa bất cứ thứ gì, những gì bạn đang mô tả là một điều kiện chủng tộc điển hình sẽ xảy ra cuối cùng nếu các luồng truy cập dữ liệu được chia sẻ mà không đồng bộ hóa thích hợp. Như đã đề cập, việc khai báo một biến volatiletrong trường hợp này sẽ chỉ đảm bảo rằng các luồng khác sẽ nhìn thấy sự thay đổi của biến (giá trị sẽ không được lưu vào bộ nhớ đệm trong một thanh ghi của một số bộ đệm mà chỉ được nhìn thấy bởi một luồng).

Sự khác biệt giữa AtomicIntegervà là volatile intgì?

AtomicIntegercung cấp các hoạt động nguyên tử trên một intvới đồng bộ hóa thích hợp (ví dụ. incrementAndGet(), getAndAdd(...)...), volatile intsẽ chỉ đảm bảo khả năng hiển thị của intcho chủ đề khác.

15
Peter Lawrey 2013-11-03 08:17.

Vậy điều gì sẽ xảy ra nếu hai luồng tấn công một biến nguyên thủy dễ bay hơi cùng một lúc?

Thông thường mỗi cái có thể tăng giá trị. Tuy nhiên, đôi khi, cả hai sẽ cập nhật giá trị cùng một lúc và thay vì tăng tổng cộng 2, cả hai luồng đều tăng 1 và chỉ 1 được thêm vào.

Điều này có nghĩa là bất kỳ ai khóa nó, người đó sẽ đặt giá trị của nó trước tiên.

Không có khóa. Đó là những gì synchronizeddành cho.

Và nếu trong khi chờ đợi, một số luồng khác xuất hiện và đọc giá trị cũ trong khi luồng đầu tiên đang thay đổi giá trị của nó, thì không phải luồng mới sẽ đọc giá trị cũ của nó?

Đúng,

Sự khác biệt giữa từ khóa Atomic và từ khóa dễ bay hơi là gì?

AtomicXxxx kết thúc một phần mềm dễ bay hơi nên về cơ bản chúng giống nhau, sự khác biệt là nó cung cấp các hoạt động cấp cao hơn như CompareAndSwap được sử dụng để thực hiện tăng dần.

AtomicXxxx cũng hỗ trợ lazySet. Đây giống như một tập hợp dễ bay hơi, nhưng không làm ngưng trệ quá trình chờ quá trình ghi hoàn tất. Điều đó có nghĩa là nếu bạn đọc một giá trị mà bạn vừa viết, bạn có thể thấy giá trị cũ, nhưng dù sao thì bạn cũng không nên làm như vậy. Sự khác biệt là thiết lập một biến mất khoảng 5 ns, bit lazySet mất khoảng 0,5 ns.

Related questions

MORE COOL STUFF

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett đã bất chấp những lời khuyên hẹn hò điển hình khi cô gặp chồng mình.

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Michael Sheen là một diễn viên phi lợi nhuận nhưng chính xác thì điều đó có nghĩa là gì?

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Ngôi sao của Hallmark Colin Egglesfield chia sẻ về những cuộc gặp gỡ với người hâm mộ ly kỳ tại RomaDrama Live! cộng với chương trình INSPIRE của anh ấy tại đại hội.

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Bạn sẽ phải phủi sạch đầu đĩa Blu-ray hoặc DVD để xem tại sao Northern Exposure trở thành một trong những chương trình nổi tiếng nhất của thập niên 90.

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

8 công dụng tuyệt vời của Baking Soda và Giấm

8 công dụng tuyệt vời của Baking Soda và Giấm

Bạn biết đấy, hai sản phẩm này là nguồn điện để làm sạch, riêng chúng. Nhưng cùng với nhau, chúng có một loạt công dụng hoàn toàn khác.

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Thủy điện rất cần thiết cho lưới điện của Hoa Kỳ, nhưng nó chỉ tạo ra năng lượng khi có nước di chuyển. Bao nhiêu nhà máy thủy điện có thể gặp nguy hiểm khi các hồ và sông cạn kiệt?

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Tóc tỉa từ các tiệm và các khoản quyên góp cá nhân có thể được tái sử dụng như những tấm thảm thấm dầu và giúp bảo vệ môi trường.

Một thương hiệu kế thừa khác có được cuộc sống mới khi những người chủ mới của Black Opal có được Hội chợ thời trang

Một thương hiệu kế thừa khác có được cuộc sống mới khi những người chủ mới của Black Opal có được Hội chợ thời trang

Desiree Rogers, trái, và Cheryl Mayberry McKissack Chuyển sang, Fenty Beauty và Pat McGrath, có một đế chế làm đẹp mới do phụ nữ làm chủ đang trỗi dậy. Sau thương vụ mua lại mỹ phẩm Black Opal vào tháng 9, đội ngũ quyền lực của Giám đốc điều hành công ty Desiree Rogers và Chủ tịch Cheryl Mayberry McKissack đã thông báo mua lại thương hiệu làm đẹp tiên phong Fashion Fair từ người sáng lập Johnson Publishing Company (JPC).

Ngoài việc trở nên vô nghĩa, các bên bộc lộ giới tính giờ đây đã trở nên chết người

Ngoài việc trở nên vô nghĩa, các bên bộc lộ giới tính giờ đây đã trở nên chết người

Đối với những người có quá nhiều thời gian, tiệc tiết lộ giới tính là một cách thú vị để không cần áp đặt những định kiến ​​hạn chế lên thai nhi trước một đối tượng bạn bè giả vờ quan tâm một cách lịch sự. Tuy nhiên, việc chỉ dựa vào những chiếc bánh nướng có màu nhân tạo để biểu thị một tiếng hoo-ha hoặc một đứa trẻ đi tè đã trở nên xa xỉ trong các bậc cha mẹ trên Instagram.

Kirstjen Nielsen đang cố gắng đổi mới bản thân với tư cách là một người phụ nữ 'nói ra sự thật cho sức mạnh'

Kirstjen Nielsen đang cố gắng đổi mới bản thân với tư cách là một người phụ nữ 'nói ra sự thật cho sức mạnh'

Hôm thứ Tư, cựu Bộ trưởng An ninh Nội địa Kirstjen Nielsen vì một lý do nào đó đã được đưa ra một diễn đàn để phát biểu tại Hội nghị thượng đỉnh Những người phụ nữ quyền lực nhất của Fortune. Và có thể đoán trước được, người phụ nữ giám sát các nỗ lực (đang diễn ra) của chính quyền Trump nhằm chia cắt các gia đình ở biên giới đã sử dụng thời gian của mình như một cơ hội để tự bảo vệ mình và tự nhận mình là người — và hãy hít thở sâu ở đây — “đã nói sự thật với quyền lực.

Toyota Racing Development sẽ cho ra mắt Supra 3000GT Concept, Massive Wing vào tháng tới

Toyota Racing Development sẽ cho ra mắt Supra 3000GT Concept, Massive Wing vào tháng tới

Vì thế hệ mới nhất của chiếc xe điều chỉnh được yêu thích trên thế giới hiện đã có mặt tại đây, nên chỉ có điều kiện là Toyota Racing Development sẽ đưa phiên bản Supra thế hệ thứ năm sửa đổi của riêng mình đến SEMA vào tháng tới. Toyota đã cho chúng tôi một gợi ý về những gì sẽ xảy ra trong tuần này: một chiếc Concept GR Supra 3000GT hiện đại.

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Rothschild's luggage got lost, but luckily she has an incredible closet to shop: Sister Paris Hilton's!

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa. Từ Hollywood đến New York và mọi nơi ở giữa, hãy xem các ngôi sao yêu thích của bạn đang làm gì!

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

Các nhà điều tra đang xem xét liệu nhóm và nghi phạm có biết nhau trước vụ tấn công hay không

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Vụ kiện, nêu tên một số học khu, lập luận rằng dự luật "Không nói đồng tính" được ban hành gần đây của Florida "có hiệu quả im lặng và xóa bỏ học sinh và gia đình LGBTQ +"

Đường băng hạ cánh

Đường băng hạ cánh

Cuối hè đầu thu là mùa hoài niệm. Những chiếc đèn đường chiếu ánh sáng của chúng qua những con đường đẫm mưa, và những chiếc lá dưới chân - màu đỏ cam tắt trong bóng chạng vạng - là lời nhắc nhở về những ngày đã qua.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Vào năm 2021, tôi khuyến khích bạn suy nghĩ lại mọi thứ bạn biết về khách hàng mà bạn phục vụ và những câu chuyện bạn kể cho họ. Lùi lại.

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Vào ngày sinh nhật thứ 9 của Felix The Cat, tôi nhớ về một trong những mất mát lớn nhất trong cuộc đời trưởng thành của tôi - Sophie của tôi vào năm 2013. Tôi đã viết bài luận này và chia sẻ nó trên nền tảng này một thời gian ngắn vào năm 2013.

Khi bạn không thể trở thành người mà Internet muốn bạn trở thành

Khi bạn không thể trở thành người mà Internet muốn bạn trở thành

Tôi ghét từ "tàu đắm". Mọi người cảm thấy thoải mái trong la bàn đạo đức của riêng mình, và khi làm như vậy, họ thấy mình vượt qua sự phán xét.

Language