我在哪里进行同步

时间:2014-03-10 16:42:36

标签: java synchronization

假设我有一个处理共享变量的方法。由于方法的复杂性,需要将其中的一部分封装到另一种方法中。

所以我们有这样的事情:

private void methodA()
{
    //do something...
    //do something else...

    synchronized(shared_variable)
    {
        //do something...
        methodB(shared_variable);
        //.....
        //.....
    } 
}

现在我想知道的是我是否应该同步方法B中的shared_variable。实际上我知道这不是必要的,但这段代码闻起来很糟糕。

任何解决方案如何在这种情况下正确地做事?

P.S。

我问的原因是因为在开发过程的后期,方法B可以在方法A之外调用。因此,如果我没有在methodB中的shared_variable上放置symchronization,那么它将不是线程安全的。但是当我从methodA调用methodB时,我已经锁定了shared_variable两次,所以看起来对我来说很奇怪。

2 个答案:

答案 0 :(得分:-1)

通过声明synchronized(shared_variable),您实际上在shared_variable上声明了一个监视器,这意味着每当一个线程进入同步块时,它就会获取给定对象的锁定。从理论上讲,没有其他线程能够实现监视器,直到它被初始线程释放,这在完成同步块的执行时发生(包括执行methodB)。

答案 1 :(得分:-1)

如果你这样做,在synchronized范围内,其他线程将等待它退出范围。它的工作方式;如果一个线程试图访问shared_variable并且正在被另一个线程使用,那么在没有同步的情况下,尝试访问它的那个基本上可以通过它而不会看到更新。因此,如果您同步它,则在更改它的线程完成之前,您不允许访问线程读取它。虽然,改变它的线程有时实际上可以比读取它的线程更快地改变它,从而完全没有速度损失。

所以,如果这就是你所需要的,那就这样做吧。否则,如果您不需要shared_variable准确,您可以牺牲它以获得更快的速度。而不是同步它。

编辑: 如果再次在同一对象的同步块中同步同一对象,则可以正常运行,因为锁定的对象已经在锁定内部。它只会通过。