【问题标题】:Instance method Synchronization in JAVAJAVA中的实例方法同步
【发布时间】:2015-11-07 21:13:43
【问题描述】:

假设有两个线程 A 和 B 。有一个对象有 2 个同步方法 dothisOne 和 dothisTwo,它们应该在调用程序中按顺序(dothisOne--->dothisTwo)执行。两个线程都必须遵循相同的调用顺序(dothisOne--->dothisTwo)。假设在执行 dothisOne 时都重新开始并且第一个线程 A 锁定了对象。一旦它完成 dothisOne 并控制出来......是否有 ThreadB 启动 dothisOne 的机会(或)是否 100% 保证线程 A 将用于 dothisTwo ?这个问题与实例方法有关。如果是类方法(静态),我相信threadA会选择dothisTwo

【问题讨论】:

    标签: java multithreading synchronization synchronized


    【解决方案1】:

    ThreadB 是否有机会启动 dothisOne(或)是否 100% 保证线程 A 会选择 dothisTwo?

    根本没有保证。我怀疑线程 A 更有可能转而进入 doThisTwo,因为在退出监视器和重新进入它之间基本上没有什么需要做的 - 它不需要改期什么的。但不,这两种情况都可能发生。

    如果是类方法(静态),我相信threadA会选择dothisTwo

    不——同步不关心实例方法和静态方法。静态和实例同步方法的不同之处在于它们隐式同步的监视器,但仅此而已。

    基本上,如果您希望将两件事作为一个单元发生(就同步而言),您需要围绕这对操作进行同步,而不是每个操作依次进行。

    【讨论】:

    • 很高兴知道。还有一个疑问:我们不能在静态上下文中使用同步块[ synchronized(this){} ],我们可以创建一个静态变量 myStatic 并使用 synchronized(myStatic) 吗?那将保证那里的同步对吗?
    • @SrikanthPai:是的,只要两个线程同步同一个引用。就我个人而言,我尽量避免在实例方法中对 this 进行同步...我更喜欢创建 only 用于同步的对象,因为这样更容易推理它们,因为知道 只有可以访问监视器的代码是类中的代码。
    猜你喜欢
    • 2010-09-29
    • 2012-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    相关资源
    最近更新 更多