我尝试在帐户上执行多次存款/取款交易的典型银行存款余额问题。
我已经同步了帐户类中的两个方法,并且只有在我加入所有线程时才会执行结束时帐户余额为500(等待执行完成。)
所以我正在考虑一个真实的场景,每个请求产生一个新线程执行事务并返回余额。每次报告的余额是否都是错误的,因为在同一个帐户上有其他线程在运行?
以下是代码:
trigger OpportunityInsertTrigger on Opportunity (before insert) {
System.debug('Triggered on insert of opportunity. Updating blockchain...');
for (Opportunity opp : Trigger.new) {
List<DNBCompany__c> retrievedCompany = [SELECT Id, Name, Duns__c FROM DNBCompany__c WHERE Id = :opp.DNBCompany__c];
DNBCompany__c company = retrievedCompany.get(0);
String duns = (String) company.get('Duns__c');
}
}
答案 0 :(得分:1)
由于内存可见性保证不可用于对由更新的变量进行非同步访问,因此您没有同步$('.facebook-share').click(function() {
var hrefOfQuestionClicked = getHREF();
var questionNumber = getQuestionNumber(hrefOfQuestionClicked);
getQuestionTitle(questionNumber, hrefOfQuestionClicked);
}
function getQuestionTitle(questionNumber, href) {
//-------------------PHP CALL---------------------
if (window.XMLHttpRequest) {
// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp = new XMLHttpRequest();
else {
// code for IE6, IE5
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
facebookShareCallback(xmlhttp.responseText, href);
}
};
xmlhttp.open("POST", "getQuestionTitle.php?questionID=" + questionNumber, true);
xmlhttp.send();
//-------------------PHP CALL---------------------
}
function facebookShareCallback(questionTitle, href) {
FB.ui({
method: 'feed',
link: href,
name: questionTitle,
picture: 'https://example.com/mypicture.jpg',
description: ' ',
caption: 'A question from my site.',
}, function(response) {});
}
,这意味着您可能无法获得最新值,因此余额可能不正确多线程。
只需标记方法Account.getBal()
。
如果您将余额存储为synchronized
而不是AtomicInteger
,那么也会更容易(并且几乎肯定会更高效),因为您根本不需要int
。
答案 1 :(得分:0)
我已经同步了两种方法......
所以我正在考虑一个真实世界的场景......由于其他线程在同一个账户上运行,每次报告的余额是否会不正确?
那么,这取决于你所说的“正确的平衡”。什么是正确的余额,如果其他线程可以在您要求它和打印时间之间改变它?
在多线程环境中,对“正确”含义的不同想法被称为一致性模型。
一种易于理解的一致性模型称为静态一致性。如果你的程序是静止一致的,这意味着当所有线程同时空闲时,平衡将是正确的(这里,“空闲”意味着做任何不影响平衡的事情)。它很容易定义,但测试可能很棘手:如果没有这样的时刻发生会怎么样?
另一种一致性模型称为线性化。线性化的简单定义表明,如果平衡每次都是“正确的”,那么您的程序是可线性化的,并且在完全时刻时,当您的一个线程释放用于保护平衡的锁时。