【问题标题】:Class with all methods synchronised will behave as a synchronised block?所有方法同步的类将表现为一个同步块?
【发布时间】:2014-10-07 20:52:52
【问题描述】:
public class SynchronizedCounter {
private int c = 0;

public synchronized void increment() {
    c++;
}

public synchronized void decrement() {
    c--;
}

public synchronized int value() {
    return c;
}
}

如果有两个线程,每个线程都有相同的 SynchronizedCounter 实例,这是否意味着如果一个线程调用增量,另一个线程不能调用减量。上面的代码是否等同于同步对象?即

public void run(){
    synchronised( objectReferenceSynchronisedCounter){
        if(conditionToIncrement)
        objectReference....Counter.increment();
        else
        objectReference....Counter.decrement();
    }
}

【问题讨论】:

  • 不,因为if部分在第一种情况下没有同步。
  • @njzk2 好的,所以也许我有两个可运行文件,一个递增,另一个递减。没有 if 语句。
  • 您的代码不完整,但似乎预期的答案是:不,因为在第一个版本中,线程可以在方法调用之间被抢占(incrementdecrement),另一个可以执行@ 987654327@,因此在调用之间提供非零变化。
  • 如果您的条件不依赖于对象的状态,或者更一般地说,如果您不将状态从一个调用拖到另一个调用,则代码不同但可能具有相同的结果.特别是如果你不是多线程的:)

标签: java synchronization


【解决方案1】:

有2个问题:

如果有两个线程,每个线程都有相同的 SynchronizedCounter 实例,这是否意味着如果一个线程调用增量,另一个线程不能调用减量。

没错。当另一个线程执行increment 时,对decrement 的调用将被阻塞。反之亦然。

上面的代码是否等同于同步对象? [代码如下]

您的第二个示例略有不同,因为您在同步块中包含了 if 语句。而且一般来说,如果一个同步块包含多个调用,它并不等同于同步每个单独的调用。

在Java 中没有同步对象。您同步方法或代码块。

但是,也许这就是您的意思,在您的两个示例中,锁都保存在同一个对象上,即调用其方法的对象的实例。因此,除了范围略有不同之外,这两个示例在同一个对象上以相同的方式同步。

【讨论】:

    【解决方案2】:

    答案是否定的。

    同步作用域是修改后的方法

    http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html

    【讨论】:

      【解决方案3】:

      它完全是一个同步对象。一旦您的方法之一被调用,方法上的“同步”将锁定“this”,直到方法 ID 退出,其他方法才能执行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-20
        • 2016-09-21
        • 2014-01-21
        • 2022-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多