java – 以原子方式执行代码块
你会如何回答以下问题?
我会通过制作方法来实现这一点吗? public final AtomicInteger x = new AtomicInteger(0); 然后确保返回get语句: x.get() 如果我想增加x的值,我会这样做吗? x.getAndIncrement(); 解决方法
答案取决于你对“原子”的定义
我知道三个有效的原子定义: >同步中的原子:一次只能有一个线程执行代码; 第一个可能是你的教授的意思,而且很容易实现(见下文). 第二个(ACID中的原子)可以近似.见下文. 第三个简单地无法在Java中得到保证 – 它不提供对不间断性所需的“关键部分”原语的访问.幸运的是,对此的需求几乎仅限于操作系统和设备驱动程序. 同步中的原子 这是相对简单的:只需将代码块包含在同步块中即可.我已将它显示为下面的离散块,但还有其他选项: public void doSomethingQuasiAtomic() { synchronized (exampleLock) { // Your code block goes here. // Only one thread will ever be in this block at a time. ... } } ACID中的原子 对于ACID原子性没有通用的解决方案,但它也可以使用同步代码进行近似.为了做到这一点,动作的每个部分必须是安全可逆的. 这就是我接近它的方式: 为了便于论证,假设您需要对我们称之为exampleObj的对象执行多部分操作,您可以执行三个可以安全撤消的操作,并且可以在exampleLock上同步对示例的所有访问. synchronized(exampleLock) { boolean actionOneDone=false; boolean actionTwoDone=false; boolean actionThreeDone=false; try { actionOneDone=doActionOne(exampleObj); // or perhaps exampleObj.doActionOne(); actionTwoDone=doActionTwo(exampleObj); actionThreeDone=doActionThree(exampleObj); } catch (Exception ex) { // Whatever seems appropriate here. } finally { if (! (actionOneDone && actionTwoDone && actionThreeDone)) { /* At least one part failed. Back out the completed actions in reverse order. * Note that we never need to reverse action three since if it completed,so did the others. */ if (actionTwoDone) { reverseActionTwo(exampleObj); // or perhaps exampleObj.reverseActionTwo(); } if (actionOneDone) { reverseActionOne(exampleObj); } } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |