是否允许JVM重新排序AtomicInteger调用的指令

时间:2015-09-24 15:16:52

标签: java multithreading concurrency jvm atomicinteger

是否可以安全地假设addAndGet之前的代码将始终在此调用之前执行,即JVM将重新排序AtomicInteger调用的指令?

如果是,可以安全地假设检查同一if (a.compareAndSet(0, -1))实例(例如addAndGet)的状态的其他线程将在 public string digest() { String retVal = ""; try { string url = "https://YourSite.com/"; HttpClient client = new HttpClient(new HttpClientHandler() { UseDefaultCredentials = true }); client.BaseAddress = new System.Uri(url); string cmd = "_api/contextinfo"; client.DefaultRequestHeaders.Add("Accept", "application/json;odata=verbose"); client.DefaultRequestHeaders.Add("ContentType", "application/json"); client.DefaultRequestHeaders.Add("ContentLength", "0"); StringContent httpContent = new StringContent(""); var response = client.PostAsync(cmd, httpContent).Result; if (response.IsSuccessStatusCode) { string content = response.Content.ReadAsStringAsync().Result; JsonObject val = JsonValue.Parse(content).GetObject(); JsonObject d = val.GetNamedObject("d"); JsonObject wi = d.GetNamedObject("GetContextWebInformation"); retVal = wi.GetNamedString("FormDigestValue"); } } catch { } return retVal; } FileOpenPicker picker = new FileOpenPicker(); picker.SuggestedStartLocation = PickerLocationId.PicturesLibrary; picker.ViewMode = PickerViewMode.Thumbnail; // Filter to include a sample subset of file types. picker.FileTypeFilter.Clear(); picker.FileTypeFilter.Add(".bmp"); picker.FileTypeFilter.Add(".png"); picker.FileTypeFilter.Add(".jpeg"); picker.FileTypeFilter.Add(".jpg"); // Open the file picker. StorageFile path = await picker.PickSingleFileAsync(); if (path != null) { string url = "https://YourSite.com/Subsite/"; HttpClient client = new HttpClient(new HttpClientHandler() { UseDefaultCredentials = true }); client.BaseAddress = new System.Uri(url); client.DefaultRequestHeaders.Clear(); client.DefaultRequestHeaders.Add("Accept", "application/json;odata=verbose"); client.DefaultRequestHeaders.Add("X-RequestDigest", digest()); client.DefaultRequestHeaders.Add("X-HTTP-Method", "POST"); client.DefaultRequestHeaders.Add("binaryStringRequestBody", "true"); IRandomAccessStream fileStream = await path.OpenAsync(FileAccessMode.Read); var reader = new DataReader(fileStream.GetInputStreamAt(0)); await reader.LoadAsync((uint)fileStream.Size); Byte[] content = new byte[fileStream.Size]; reader.ReadBytes(content); ByteArrayContent file = new ByteArrayContent(content); HttpResponseMessage response = await client.PostAsync("_api/web/lists/getByTitle(@TargetLibrary)/RootFolder/Files/add(url=@TargetFileName,overwrite='true')?@TargetLibrary='Project Photos'&@TargetFileName='TestUpload.jpg'", file); response.EnsureSuccessStatusCode(); if (response.IsSuccessStatusCode) { } } 调用之前看到第一个线程已更改的所有内容?

1 个答案:

答案 0 :(得分:6)

  

假设之前的代码(AtomicInteger   a).addAndGet(-1)将始终在此调用之前执行,即JVM   不会重新排序addAndGet调用的指令吗?

是的,没错。 addAndGet将发出易失性存储(或类似),因此其他负载和存储不能在其下重新排序。

编辑:感谢Soitrios链接https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/package-summary.html,这表明您已经建立了订购。

  
      
  • get具有读取volatile变量的记忆效应。
  •   
  • set具有写入(赋值)volatile变量的记忆效应。
  •   
  • compareAndSet和所有其他读取和更新操作(如getAndIncrement)具有读取和写入volatile变量的内存效果。
  •