处理现实世界中银行交易的并发请求

时间:2016-02-18 17:03:36

标签: java multithreading concurrency

我尝试在帐户上执行多次存款/取款交易的典型银行存款余额问题。

我已经同步了帐户类中的两个方法,并且只有在我加入所有线程时才会执行结束时帐户余额为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');            
    }
}

2 个答案:

答案 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)

  

我已经同步了两种方法......

     

所以我正在考虑一个真实世界的场景......由于其他线程在同一个账户上运行,每次报告的余额是否会不正确?

那么,这取决于你所说的“正确的平衡”。什么正确的余额,如果其他线程可以在您要求它和打印时间之间改变它?

在多线程环境中,对“正确”含义的不同想法被称为一致性模型

一种易于理解的一致性模型称为静态一致性。如果你的程序是静止一致的,这意味着当所有线程同时空闲时,平衡将是正确的(这里,“空闲”意味着做任何不影响平衡的事情)。它很容易定义,但测试可能很棘手:如果没有这样的时刻发生会怎么样?

另一种一致性模型称为线性化。线性化的简单定义表明,如果平衡每次都是“正确的”,那么您的程序是可线性化的,并且在完全时刻时,当您的一个线程释放用于保护平衡的锁时。