假设我有一个处理共享变量的方法。由于方法的复杂性,需要将其中的一部分封装到另一种方法中。
所以我们有这样的事情:
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两次,所以看起来对我来说很奇怪。
答案 0 :(得分:-1)
通过声明synchronized(shared_variable)
,您实际上在shared_variable
上声明了一个监视器,这意味着每当一个线程进入同步块时,它就会获取给定对象的锁定。从理论上讲,没有其他线程能够实现监视器,直到它被初始线程释放,这在完成同步块的执行时发生(包括执行methodB
)。
答案 1 :(得分:-1)
如果你这样做,在synchronized
范围内,其他线程将等待它退出范围。它的工作方式;如果一个线程试图访问shared_variable并且正在被另一个线程使用,那么在没有同步的情况下,尝试访问它的那个基本上可以通过它而不会看到更新。因此,如果您同步它,则在更改它的线程完成之前,您不允许访问线程读取它。虽然,改变它的线程有时实际上可以比读取它的线程更快地改变它,从而完全没有速度损失。
所以,如果这就是你所需要的,那就这样做吧。否则,如果您不需要shared_variable准确,您可以牺牲它以获得更快的速度。而不是同步它。
编辑: 如果再次在同一对象的同步块中同步同一对象,则可以正常运行,因为锁定的对象已经在锁定内部。它只会通过。