使用synchronized时不需要原子引用(Atomic references are unnecessary when using synchronized)
此代码来自Fred Long的Java Concurrency Guidelines一书。 我知道一组原子操作不是原子操作。 所以下面的代码是不合规的。 要查找代码,请查看第23页。
public class Adder { private AtomicReference<BigInteger> first; private AtomicReference<BigInteger> second; public Foo(BigInteger f, BigInteger s) { first = new AtomicReference<BigInteger>(f); second = new AtomicReference<BigInteger>(s); } public void update(BigInteger f, BigInteger s) { first.set(f); second.set(s); } public BigInteger add() { return first.get().add(second.get()); } }
正确的解决方案如下所示:
final class Adder { // ... public synchronized void update(BigInteger f, BigInteger s){ first.set(f); second.set(s); } public synchronized BigInteger add() { return first.get().add(second.get()); } }
但我认为正确解决方案中的原子引用是多余的,因为
synchronized
保证了可见性和原子性。所以我的解决方案看起来像这样:
public class Addrer { private BigInteger first; private BigInteger second; public Addrer(BigInteger f, BigInteger s) { first = f; second = s; } public synchronized void update(BigInteger f, BigInteger s) { first = f; second = s; } public synchronized BigInteger add() { return first.add(second); } }
我对吗?
This code came from the book Java Concurrency Guidelines by Fred Long. I understand that a group of atomic operations is not an atomic operation. So the code below is non-compliant. To find the code, please take a look at page 23.
public class Adder { private AtomicReference<BigInteger> first; private AtomicReference<BigInteger> second; public Foo(BigInteger f, BigInteger s) { first = new AtomicReference<BigInteger>(f); second = new AtomicReference<BigInteger>(s); } public void update(BigInteger f, BigInteger s) { first.set(f); second.set(s); } public BigInteger add() { return first.get().add(second.get()); } }
And the right solution looks like this:
final class Adder { // ... public synchronized void update(BigInteger f, BigInteger s){ first.set(f); second.set(s); } public synchronized BigInteger add() { return first.get().add(second.get()); } }
But I think the atomic references in the correct solution are redundant because
synchronized
guarantees both visibility and atomicity.So my solution would look like this:
public class Addrer { private BigInteger first; private BigInteger second; public Addrer(BigInteger f, BigInteger s) { first = f; second = s; } public synchronized void update(BigInteger f, BigInteger s) { first = f; second = s; } public synchronized BigInteger add() { return first.add(second); } }
Am I right?
原文:https://stackoverflow.com/questions/30005395
最满意答案
您可以使用全局事件来执行此操作,使用.ajaxSend()和.ajaxComplete()处理程序
$(document).ajaxSend(function (event, jqXhr, opts) { jqXhr._start = new Date().getTime(); }); $(document).ajaxComplete(function (event, jqXhr, opts) { var end = new Date().getTime(); console.log('Time taken:', opts.url, end - jqXhr._start) });
演示: 小提琴
或者,您可以使用任何网络监视工具,例如浏览器的开发人员工具中的网络选项卡。
You can use the global events to do it, use the .ajaxSend() and .ajaxComplete() handlers
$(document).ajaxSend(function (event, jqXhr, opts) { jqXhr._start = new Date().getTime(); }); $(document).ajaxComplete(function (event, jqXhr, opts) { var end = new Date().getTime(); console.log('Time taken:', opts.url, end - jqXhr._start) });
Demo: Fiddle
Or you can use any network monitoring tools like the network tabs in the developer tools of browsers.
相关问答
更多-
通过本地客户端程序获取服务器mysql数据库信息[2023-04-27]
ajax -
使用javascript设置样式和属性根本不起作用,因此您唯一的选择是在没有javascript的情况下设置它 小提琴 Setting the styles and attribute with javascript simply doesn't work at all, so your only option is to set it without ...
-
使用jQuery REal Person时的Javascript AJAX计时问题(Javascript AJAX timing issue while using jQuery REal Person)[2022-04-21]
因为你在回调函数内部返回ajax函数,它将其值返回给回调函数,而不是外部函数checkCaptcha()。 在checkCaptcha()完成之前,没有办法使你的bValid变量等待,所以不要那样,在ajax函数回调中放置你想要做的bValid变量,可能如下: $.post("ajax/check_captcha.php", { whatever: whatever} ,function(data) { // If data = Error reload page if ($.trim(da ... -
在日期框中的更改事件中,您可以检查是否是今天。 如果是今天,那么你只能展现未来的时间。 其他明智的选择这样的所有时间。您可以使用全局事件来执行此操作,使用.ajaxSend()和.ajaxComplete()处理程序 $(document).ajaxSend(function (event, jqXhr, opts) { jqXhr._start = new Date().getTime(); }); $(document).ajaxComplete(function (event, jqXhr, opts) { var end = new Date().getTime(); console.log ...
如何计时ajax查询(发送查询,处理,接收响应)(How do I time an ajax query (send query, processing, receive response))[2022-12-17]
请参阅“ 如何确定何时,确定发送HTTP请求的网络延迟? ”,答案解释了如何使用服务器端时间“校准”客户端时间。 请注意,此校准不准确 。 希望这可以帮助。 See "How do you determine exactly when, accounting for network latency, a HTTP request was sent?", the answer explains how you can "calibrate" the client-side time with the serv ...关于jQuery AJAX的问题(Question on jQuery AJAX)[2023-02-22]
1)你需要了解HTTP。 get并post “GET”和“POST”请求,这对于构建RESTful服务非常有用。 编辑:我实际上没有看到ajax对象上的get和post方法; 你传递一个'type'参数来指定你想要使用的HTTP方法。 2) success激发成功,即如果响应返回200. complete总是在所有其他事情完成后触发。 3)理想情况下,你的服务器会返回json。 如果您将Ajax调用配置为期望json,那么它会为您解析它。 4)文档非常清楚,在调用实际的底层ajax请求之前触发beforeS ...如果你无法实现数据包加载等,那么超时可能是你最好的选择。 $.ajax({ dataType: "json", url: uriTrackers, // Your URL here. //data: data, //we are not sending data, this is a different data to the one below timeout: 10000 //10 second timeout or maybe 30 ...你可以遵循这个策略: - 在您的asp.net MVC后端中每隔(一段时间)更改Etag。 启用'cache:true'查找Etag或在Request Header中进行上次修改(如果发生任何更改) 对于请求标题,有人写了一个很好的答案, https://stackoverflow.com/a/12501696/713789 You can follow this strategy:- Change the Etag every (period of time) in your asp.net MVC ba ...相关文章
更多- \ 关于业务逻辑 我是否需要synchronized 方法 困惑?
- 与synchronized有关的线程同步问题的一点非常规情况
- 一步一步掌握线程机制(三)---synchronized和volatile的使用
- JSP页面引用的外部样式表文件,在用户请求时是如何下载的?
- 请教一个问题。单例模式适用什么场景,不适用什么场景
- Solr原子更新
- 怎么才能有效防止并发情况下创建重复的数据库记录?
- solr的原子更新
- 先试试
- Hadoop HDFS源码学习笔记(五)
最新问答
更多- h2元素推动其他h2和div。(h2 element pushing other h2 and div down. two divs, two headers, and they're wrapped within a parent div)
- 创建一个功能(Create a function)
- 我投了份简历,是电脑编程方面的学徒,面试时说要培训三个月,前面
- PDO语句不显示获取的结果(PDOstatement not displaying fetched results)
- Qt冻结循环的原因?(Qt freezing cause of the loop?)
- TableView重复youtube-api结果(TableView Repeating youtube-api result)
- 如何使用自由职业者帐户登录我的php网站?(How can I login into my php website using freelancer account? [closed])
- SQL Server 2014版本支持的最大数据库数(Maximum number of databases supported by SQL Server 2014 editions)
- 我如何获得DynamicJasper 3.1.2(或更高版本)的Maven仓库?(How do I get the maven repository for DynamicJasper 3.1.2 (or higher)?)
- 以编程方式创建UITableView(Creating a UITableView Programmatically)
- 如何打破按钮上的生命周期循环(How to break do-while loop on button)
- C#使用EF访问MVC上的部分类的自定义属性(C# access custom attributes of a partial class on MVC with EF)
- 如何获得facebook app的publish_stream权限?(How to get publish_stream permissions for facebook app?)
- 如何防止调用冗余函数的postgres视图(how to prevent postgres views calling redundant functions)
- Sql Server在欧洲获取当前日期时间(Sql Server get current date time in Europe)
- 设置kotlin扩展名(Setting a kotlin extension)
- 如何并排放置两个元件?(How to position two elements side by side?)
- 如何在vim中启用python3?(How to enable python3 in vim?)
- 在MySQL和/或多列中使用多个表用于Rails应用程序(Using multiple tables in MySQL and/or multiple columns for a Rails application)
- 如何隐藏谷歌地图上的登录按钮?(How to hide the Sign in button from Google maps?)
- Mysql左连接旋转90°表(Mysql Left join rotate 90° table)
- dedecms如何安装?
- 在哪儿学计算机最好?
- 学php哪个的书 最好,本人菜鸟
- 触摸时不要突出显示表格视图行(Do not highlight table view row when touched)
- 如何覆盖错误堆栈getter(How to override Error stack getter)
- 带有ImageMagick和许多图像的GIF动画(GIF animation with ImageMagick and many images)
- USSD INTERFACE - > java web应用程序通信(USSD INTERFACE -> java web app communication)
- 电脑高中毕业学习去哪里培训
- 正则表达式验证SMTP响应(Regex to validate SMTP Responses)