Java LinkedBlockingQueue中的非易失性头部和尾部引用

时间:2016-10-10 14:05:24

标签: java concurrency

java.util.concurrent.LinkedBlockingQueue为什么headtail引用为非volatile

另一个帖子可能无法看到一个帖子中headtail的任何更改,这会导致问题吗?

3 个答案:

答案 0 :(得分:8)

headtailputLocktakeLock保护volatilevolatile。只要您进行适当的同步,您就不需要将字段声明为$(document).ready(function(){ $('.fabric').on('change',function(){ var fabricID = $(this).val(); console.log("fabric id_price is " + fabricID); //debugging if(fabricID){ $.ajax({ type:'GET', url:'cart_functions.php', dataType: 'json', data: { fabric_id: fabricID }, success:function(html){ $('.icms' + id).text(data.val); } }); //closing tags $('.size').on('change',function(){ var sizeID = $(this).val(); if(sizeID){ $.ajax({ type:'GET', url:'cart_functions.php', dataType: 'json', data:{ size_id: sizeID }, success:function(html){ $('.icms' + id).text(data.val); } }); //closing tags

所以,回答你的问题。如果字段正确同步(它们是),则字段不需要<?php header('Content-Type: application/json'); include_once '../incluedes/conn_cms.php'; if(isset($_GET["size_id"],$_GET["fabric_id"])){ $size_id=$_GET["size_id"] ; $fabric_id=$_GET["fabric_id"] ; $query3 =" SELECT * FROM valores_almofadas WHERE size='$size_id' AND price_id ='$fabric_id'"; $result = mysqli_query($conn,$query3); while($rows = mysqli_fetch_assoc($result)){ if($_SESSION['estado'] == 'SP'){ $ICMS = $rows['icms_7']; }else{ $ICMS = $rows['icms_12']; } $_SESSION['icms']=$ICMS; } echo json_encode($_SESSION['icms']); } ?>

如果您发现有一部分代码存在疑问,请告诉我,否则我找不到任何需要变动的原因。

答案 1 :(得分:0)

简短回答:不,它不会导致可见性问题。

答案很长:它已被阻止,即在听到实施时它有某种<?xml version="1.0" encoding="utf-8" ?> <MasterDetailPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms" prism:ViewModelLocator.AutowireViewModel="True" xmlns:local="clr-namespace:PrismMasterDetailSample.Views;assembly=PrismMasterDetailSample" x:Class="PrismMasterDetailSample.Views.PMasterDetailPage"> <MasterDetailPage.Master Title="Menu"> <!--<local:MenuPage /> <========== does not work --> <ContentPage Title="Default"> <StackLayout> <Button Text="About" Command="{Binding NavigateCommand}" CommandParameter="MyNavigationPage/ViewA?id=A" /> </StackLayout> </ContentPage> </MasterDetailPage.Master> <MasterDetailPage.Detail> <NavigationPage> <x:Arguments> <local:PTabbedPage /> </x:Arguments> </NavigationPage> </MasterDetailPage.Detail> </MasterDetailPage> 块。您可以通过using Xamarin.Forms; namespace PrismMasterDetailSample.Views { public partial class PMasterDetailPage : MasterDetailPage { public PMasterDetailPage() { InitializeComponent(); } } } 块传播变量更改。

答案 2 :(得分:0)

  

java.util.concurrent.LinkedBlockingQueue有头尾   引用为非易失性

首先,volatile是一种同步技术,但不是唯一的技术 - 其他同步技术是显式锁定,因此volatile并非始终是强制性的,只要锁定即可处理字段同步。正如John Vint的回答所解释的那样,这里使用了这两个锁。

其次,您通常不会将volatile视为参考类型。它通常用于原始类型,请参阅此another SO question以获得更多解释 - 这两个答案都很棒。

同样refer this question看到仅仅声明引用类型为volatile有时是不够的,并且仍然可能产生不正确的结果,因为对于引用类型通常很重要的是引用类型字段的非陈旧值而不是实际参考本身。对于所有线程正确可见的非陈旧引用可能具有不同线程中的基础对象的陈旧字段值。