分享

Java中的synchronization工作原理

 昵称11935121 2018-02-26

Java中的synchronization工作原理

定义

同步意味着控制多个线程对共享资源的访问。

举例

现在我们将创建一个基本的银行应用程序,其中2个客户(线程)将尝试从单个银行账户存入/取出一笔金额

Java中的synchronization工作原理

创建银行实体

Bank 类包含私有的Map实例变量accountNumberVsAccount。

它有一个方法 getAccount,它只是返回账号的BankAccount实例。

Java中的synchronization工作原理

BankAccount 包含accountNumber 和 balance,和两个方法(withdraw和deposit)有没有进行更新的帐户余额。此外,如果余额不足,返回错误消息。

Java中的synchronization工作原理

让我们看看客户在做什么。运行时:

获取Bank 实例

  • 从BankAccount 对象中获取对象 bank

  • 将100元存入账户

  • 最后,从账户中提取200元

  • 现在,如果两个客户(两个客户类实例)同时运行会发生什么?两者都将从BankAccount 银行获得SAME对象。

    然后两人都将100元存入该账户。余额应该是200。

  • 现在两个客户都会尝试取出200,但只有一个客户应该能够取出200个(认为这是在真实世界的情况下)。

  • 由于该账户中没有余额,所以另一位客户不应该能够提取这笔款项

Java中的synchronization工作原理

现在运行3-4次main方法并分析输出。你会看到行为不一致。有时候,一个客户可以取款,有时两个客户都不能取款。理想情况下,每次客户应该可以从账户中提取金额。但事实并非如此。

Java中的synchronization工作原理

为了使此行为保持一致并使其按预期工作,我们需要 在对其执行任何操作(存入/取出)之前同步该 BankAccount 对象。

要同步对象,我们需要编写:

synchronized (object) {

// do some operations on obj

}

所以,我们修改Customer类:

Java中的synchronization工作原理

这意味着当前线程需要在对帐户对象进行任何操作之前获得锁定。

为了更深入地理解它,让我们在IDE中调试应用程序。将断点放在Customer类中

Java中的synchronization工作原理

应用程序将以调试模式启动

Java中的synchronization工作原理

程序有2个线程:客户1和客户2,接下来我们选择线程“客户1”按F6,

Java中的synchronization工作原理

然后选择线程“客户2”

Java中的synchronization工作原理

这意味着此线程(客户1)获得了BankAccount的该对象的锁定,因此如果另一个线程试图获取该对象的锁定,该线程将被阻止。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多