Soru 32/64 bit jvm üzerinde java ilkellerinin boyutu?


  1. Bedeni int 32 bit ve long/double 64 bit. Bu boyutlar aynı kalır
    1. 32/64 bit JVM
    2. 32/64 bit işlemciler
  2. eğer evet ise o zaman long/double 64 bit işlemci / JVM üzerinde atomik olmak mı?

Oracle Java öğreticisi diyor:

Okumalar ve yazmalar, referans değişkenler ve çoğu ilkel değişkenler için (uzun ve çift hariç tüm türler) atomiktir.

Bu ifadenin jvm / işlemci mimarisiyle ilgisi var mı? Birisi açıklayabilir mi lütfen.

3. Sonunda 64 bit jvm ve işlemci kullanırsam çift / uzun atomik okuma / yazma yapabilirim.


21
2018-03-01 06:49


Menşei


@joachinm hala inandırıcı bir cevap buluyorum. Biraz yardımcı olabilir lütfen - Rekha
Neredeyse 4 yıl sonra ilgilenirseniz, bakmak isteyebilirsiniz stackoverflow.com/questions/23120811/... - yfklon


Cevaplar:


Evet, boyutlar hem 32 bit hem de 64 bit JVM'de aynıdır. Atama Java'da uzun veya iki kez atomik olması garanti edilmez. Atomik atama, başka bir iş parçacığından hala görünürlük garantisi değildir. İş parçacıklarının bellekteki değişkenleri gölgelendirmesine izin verildiğinden, bir değişkene atom ataması bile, ana belleğe yazılması zorunlu değildir (ancak ana bellek olduğunda). olduğu güncellenmiş, atomik olarak yapılacaktır. Sen şart Bir iş parçacığının sürekli olarak diğeri tarafından değişiklikleri görmesini beklerseniz, iki veya daha çok iş parçacığından paylaşılan duruma erişirken bir tür eşitleme engellerini kullanın.


15
2018-03-01 06:56



Aslında, özellikleri okuyarak, bir sayfayı belirtmek için bir sayfa ayırmış gibi görünüyor. long ve double doğal olarak atomik değildir. Diğer her şeyin olduğu anlamına gelir. Özellikle, "iki parça" olarak okunan 64-bit değerlerinin tedavisini tartıştıkları zaman (yani: iki bağımsız, ancak tek atomik, 32-bit okumalar). Şimdi, atomlar atomik olmaları, diğer her şeyle senkronize oldukları anlamına gelmez ... ancak bir okuma 32 bit okuyacaktır ve bir yazıda 32 bit yazılacaktır. - cHao
Bu cevap doğru değildir - int ve diğer tüm primitifler <= 32 bitin herhangi bir JVM'de (32bit veya 64 bit) atomik olması garanti edilir. Uzun ve çiftlerin atomik olmaları garanti edilmez, ancak (ve en çok 64-bit JVM'lerde olduğuna inanıyorum) - mikera
@mikera bunu işaretlediğiniz için teşekkürler ... doğruluk için güncellendi. - brettw
BTW: Bu erişim için garanti edilmez long ve double atomik değildir. Her zaman bir mimaride çalıştığı ve yıllarca doğru şekilde çalıştığı bir program yazabilir, ancak daha sonra bazı değişiklikler (Java sürümü veya farklı donanımlar kullanarak) nedeniyle başarısız olur. - Peter Lawrey
@PeterLawrey: Olması beklenmediğinde atomik bir şeyden dolayı bir hata meydana gelmesi çok nadir görülür - ve bu hatalar MMIO gibi donanımsal bir şeyle ilgili olabilir (Java'da mevcut değildir). diğer türlü. Yani, orada en kötüsünü varsayarsanız, o zaman gerçekleşen en kötü şey, uygulamanızın çalışmasıdır. :) - cHao


Boyutu değiştiren tek veri türü referanstır. Bunlar 32 bit veya 64 bit olabilir. 64-bit JVM'lerde 64-bitlik referansların olduğu ve daha fazla bellek kullanmak için orada olacağı yaygın bir yanlış anlamadır. Sun / Oracle Java 6 güncellemesinde 23 ve üstü 32-bit referansı kullanmak için varsayılan değer haline geldi.

Not: 64 bit referanslar atomiktir. long ve double Bu platformlardaki erişimler de atomik olabilir. (Tüm sistemlerde, özellikle de 32 bit JVM'de olduğu garanti edilmemiştir)


5
2018-03-01 08:03





Göre JLS:
İntegral türler, değerleri 8 bit, 16 bit, 32 bit ve 64 bit, sırasıyla iki tamamlayıcı tamsayıları, ve değerleri 16 bit imzasız tamsayı olan char, bayt, kısa, int ve long'dur. UTF-16 kod birimlerini temsil eden.

Aynı float ve double için de geçerli.

32 bit / 64 bit işlemcilerden / uygulama jvm'lerinden bahsedilmiyor, bu nedenle 32 veya 64 bit boyutunda bir değişiklik olmayacak.


4
2018-03-01 06:54





int 32 bit olarak tanımlanır. 64 bit ve 32 bit VM ile değişmeyecek. İle aynı long - 64 bit ve değişmeyecek.

double birazcık zor. Spesifikasyonlar 64 bit genişliğinde olduğunu söylüyor, bu yüzden en azından buna güvenebilirsiniz. Bazı VM'ler gerçek matematiği yapmak için daha geniş sayıları kullanabilir, ancak her zaman tedavi ederseniz iyi olacaksınız. double 64 bit numara olarak (ya da belirttiyseniz) strictfpsayıları sağlamak için beklenen kesinlikle 64 bit genişliğinde veya en azından oldukları gibi davranırlar.

Atomikliğe gelince, bu bir şekilde platforma bağlıdır ... ama int'ten daha büyük bir şeye yazıp okuduğunu kabul edersiniz. değil atomik (değişken işaretlenmemişse) volatile). Ve aynı konumu okumak ve yazmayı içeren her şey, herhangi bir tür için atomik değildir. (Bunun anlamı ++a; doğal olarak atomik değildir.)


3
2018-03-01 06:55





İlkellerin boyutları aynı kalır. 64 bit işlemci / jvm'de yığın boyutları daha büyüktür ve kullanılabilecek iplik sayısı büyür.


2
2018-03-01 06:58