En minneskonsistensmodell (eller helt enkelt en minnesmodell) definierar de möjliga värden som en delad minnesläsning kan återvända i ett flertrådat programmeringsspråk. Att välja en minne modell innebär en inneboende prestanda-programmerbarhet kompromiss. Javaspråket har antagit en avslappnad (eller svag) minne modell som är utformad för att erkänna de flesta traditionella kompilator optimeringar och undanröja behovet av hårdvarustaket på de flesta delade minnesåtkomster. Nackdelen är dock att programmerare utsätts för en komplex och ointuitiv semantik och måste noggrant förklara vissa variabler som flyktiga för att genomdriva programbeställningar som är nödvändiga för rätt beteende. Detta dokument föreslår en enklare och starkare minnesmodell för Java genom en konceptuellt liten förändring: varje variabel har flyktiga semantik som standard, men språket tillåter en programmerare att märka vissa variabler, metoder, eller klasser som avslappnad och ger den nuvarande Java semantik för dessa delar av kod. Denna volatila-för-standard semantik ger sekventiell konsistens (SC) för alla program som standard. Samtidigt behåller expertprogrammerare friheten att bygga prestandakritiska bibliotek som bryter mot SC semantiken. I början är det oklart om semantiken är praktisk för Java, med tanke på kostnaden för minnesstängsel på dagens maskinvaruplattformar. Kärnan i detta dokument är att visa, genom omfattande empirisk utvärdering, att volatila-för-standard semantik är säkert acceptabelt för ett dominerande användningsfall för Java idag — server-side-program som körs på Intel x86 arkitekturer. Vi presenterar VBD-HotSpot, en modifiering av Oracles allmänt använda HotSpot JVM som implementerar volatila-för-standard semantik för x86. VBD-HotSpot är den första implementeringen av SC för Java inom ramen för en modern JVM. VBD-HotSpot har en genomsnittlig overhead jämfört med utgångsvärdet för HotSpot JVM på 28 % för Da Capo-riktmärkena, vilket är betydande men kanske mindre än vad som vanligen antas. VBD-HotSpot har dessutom genomsnittliga omkostnader på 12 % respektive 19 % på standardriktmärkessviter för stordataanalys och maskininlärning i det allmänt använda Spark-ramverket. CCS-koncept: · Programvara och dess teknik → Konkurrenta programmeringsspråk; Just-in-time kompilatorer; Ytterligare Key Words och fraser: minne konsekvens modeller, volatila som standard, sekventiell konsistens, Java virtuella maskin Tillstånd att göra digitala eller hårda kopior av hela eller en del av detta arbete för personligt eller klassrum användning beviljas utan avgift förutsatt att kopior inte görs eller distribueras för vinst eller kommersiella fördelar och att kopior bär detta meddelande och den fullständiga citering på första sidan. Upphovsrätt till delar av detta verk som ägs av andra än upphovsmannen måste hedras. Abstraktering med kredit är tillåten. För att kopiera på annat sätt, eller återpublicera, för att posta på servrar eller för att omfördela till listor, krävs tidigare specifik behörighet och/eller avgift. Begär tillstånd från authoritys@acm.org.  49:2 Lun Liu, Todd Millstein och Madanlal Musuvathi En minneskonsistensmodell (eller helt enkelt en minnesmodell) definierar de möjliga värden som en delad minnesläsning kan återvända och därmed spelar en central roll i semantiken i ett flertrådat programmeringsspråk. Att välja en minne modell för ett språk innebär en inneboende performanceprogrammability kompromiss. Sekventiell konsistens (SC) [Lamport 1979 ] ger en intuitiv programmeringsmodell genom att se till att ett programs instruktioner (förekommer) utförs i en global total order som överensstämmer med den per-trådade programbeställningen. Men att uppnå SC kräver kompilatorn för att inaktivera några vanliga optimeringar, och på nuvarande maskinvaruplattformar kräver det ytterligare kompilatorn för att begränsa maskinvaruoptimering genom att ge dyra staketinstruktioner på delade minnesåtkomster. För att undvika denna kostnad, Java språk [Manson et al. 2005] har antagit en avslappnad (eller svag) minne modell som är utformad för att erkänna de flesta traditionella kompilator optimeringar och undanröja behovet av hårdvarustaket på de flesta delade minnesåtkomster. Nackdelen är dock att programmerare noggrant måste deklarera vissa variabler som flyktiga för att genomdriva den per-tråd programbeställningar som krävs för korrekt beteende. Om en programmerare inte antecknar de nödvändiga variablerna som flyktiga, utsätts program för den avslappnade semantiken i Java-minnesmodellen (JMM), som är komplex, ointuitiv, och kan bryta mot kritiska programinvarianter. Till exempel, under JMM ett objekt kan nås innan dess konstruktör har slutfört, tillgång till longs och dubbletter garanteras inte att vara atomära, och vissa programmering idiomer, såsom dubbelkontrollerad låsning [Bacon et al. 2017; Schmidt och Harrison 1997], är inte garanterade att bete sig korrekt. Som diskuterats i Avsnitt 3, är denna möjlighet inte bara teoretisk: fel på grund av underlåtenhet att annotera vissa variabler som flyktiga, som vi kallar saknade-annotering buggar, kan hittas i en rad allmänt använda Java-program. Denna performance-by-default strategi för minnesmodeller är godtagbar för och överensstämmer med designfilosofin för språk som C och C++ [Boehm och Adve 2008]. Men vi hävdar att en sådan strategi strider mot designfilosofin för łsafež språk som Java. I själva verket, när det gäller typ- och minnessäkerhet, använder Java istället en säker-för-standard och prestanda-för-val: typ och minne säkerhet tillhandahålls som standard, men det finns ett bibliotek av typ-osäkra operationer avsedda för användning av expert programmerare i prestandakritisk kod [Mastrangelo et al. Denna förordning träder i kraft den tjugonde dagen efter det att den har offentliggjorts i Europeiska unionens officiella tidning. I samma anda, detta dokument föreslår en säker-för-standard och prestanda-för-val för att genomdriva per-tråd programordning i Java. Detta tillvägagångssätt innebär en konceptuellt enkel förändring av minnesmodellen: varje variabel har flyktig semantik som standard, men språket tillåter en programmerare att märka vissa klasser, metoder, eller variabler som avslappnad och ger den nuvarande JMM semantik för dessa delar av kod. Denna volatila-för-standard semantik ger en naturlig form av sekventiell konsistens för Java som standard, på bytekod nivå: bytekod instruktioner (förefaller) köra atomärt och i programordning. Detta innebär också att alla Java primitiva värden, inklusive (64-bitar) dubblerar och longs, är atomära oavsett bit-bredden av den underliggande arkitekturen. Samtidigt behåller experter programmerare friheten att bygga prestandakritiska bibliotek som bryter mot denna semantik, och de är ansvariga för att skydda kunder från eventuella svaga beteenden som kan resultera.
REF har föreslagit en starkare Java-minnesmodell, som som standard har sekventiell konsistens semantik.
A volatile-by-default JVM for server applications
{'venue': 'PACMPL', 'journal': None, 'mag_field_of_study': ['Computer Science']}