要在哪些对象上进行同步?为什么局部变量不好?

安娜·玛丽亚(Ana Maria):

关于同步的堆栈溢出有很多资料,但是关于确定哪个对象用作内部锁,我仍然没有获得高质量的内容。凭经验可以实际回答一个好答案吗?

那么我应该选择“监视器”作为实例变量或局部变量还是拥有该方法的实例?他们三个都做得很好。同样,原始值包装器类使用“池”,所以在那里也没有问题,因为线程“攻击”相同的锁。

那么为什么更好地做到这一点(这个):

class A {
    void methodA(){
        synchronized (this){
            //some code    
        }
    }
}

在此(实例变量)上:

class A {
    String monitor = "monitor";
    void methodA(){
        synchronized (monitor){
            //some code
        }
    }
}

或以上(局部变量):

class A {
    void methodA(){
        String monitor = "monitor";
        synchronized (monitor){
            //some code
        }
    }
}

它们都工作正常/相同。那么,为什么我读到我应该避免在局部变量隐式使用池存储对象时避免局部变量?在这种情况下,变量的作用范围是什么?

谢谢!

乔尼:

您应该避免使用监视存储在局部变量中的对象的监视器,因为通常只有当前线程才能访问存储在局部变量中的对象。但是由于在这种特殊情况下,局部变量实际上从常量池中保存了一个全局共享的对象,因此您不必为此烦恼。

使用常量池对象的监视器的问题如下:

String monitor = "monitor";
void methodA() {
    synchronized (monitor){
        //some code
    }
}

...是只有一个合并的常量对象。

methodA即使已确保应该安全(例如,您不触摸静态共享状态)A类的两个不同实例上运行的两个不同线程也无法同时进入同步块

更糟糕的是:在其他地方可能还有其他一些B类,这也恰好在常量“监视”字符串上进行同步。现在,使用类B的线程将阻止其他不相关的线程使用类A。

最重要的是,创建死锁非常容易,因为您不知不觉间在线程之间共享锁。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Java

为什么要在SynchronizedMap或SynchronizedCollections上进行同步?

来自分类Java

为什么要在静态锁成员而不是类上进行同步?

来自分类Dev

为什么在字段变量上进行同步并在同步块内对其进行递增操作会导致打印混乱?

来自分类Dev

为什么lambda对象中的局部变量是const?

来自分类Java

在Integer上进行同步时,为什么notifyAll()引发IllegalMonitorStateException?

来自分类Java

同步局部变量

来自分类Java

局部变量同步

来自分类Java

局部变量同步

来自分类Dev

为什么要在C中重新加载静态局部变量?

来自分类Dev

函数的静态局部变量对象在哪里定义?

来自分类Dev

如果多个线程使用公共方法读取特定键的值,我们是否需要在私有静态 Map 对象上进行同步?

来自分类Dev

局部变量在哪里?

来自分类Java

为什么增强的for循环的局部变量必须是局部的?

来自分类Dev

同步于局部变量,比同步方法好吗?

来自分类Dev

外部文件中的未定义局部变量(“为什么要对Ruby进行Poignant指南”)

来自分类Dev

为什么函数无法访问外部声明的对象中的局部变量

来自分类Dev

为什么要使用HttpClient进行同步连接

来自分类Dev

为什么通过HttpWebRequest使用HttpClient进行同步请求

来自分类Dev

是否有必要在列表上进行同步,而仅在进行删除操作时才可以访问该列表

来自分类Java

为什么在case语句中变量不是局部变量?

来自分类Dev

为什么要在小对象上同步?

来自分类Dev

在类对象上进行同步会阻塞整个类(及其成员)

来自分类Dev

应该在列表本身还是在锁对象上进行同步?

来自分类Dev

从密钥中删除对象后,是否需要在NSUserDefaults中进行同步?

来自分类Dev

什么是内存模型中的局部变量和对象?

来自分类Dev

为什么局部变量不超出范围?

来自分类Java

为什么局部变量在Java中是线程安全的

来自分类Dev

为什么局部变量会在Python中循环

来自分类Java

为什么在HashMap.keySet声明局部变量KS()?

Related 相关文章

  1. 1

    为什么要在SynchronizedMap或SynchronizedCollections上进行同步?

  2. 2

    为什么要在静态锁成员而不是类上进行同步?

  3. 3

    为什么在字段变量上进行同步并在同步块内对其进行递增操作会导致打印混乱?

  4. 4

    为什么lambda对象中的局部变量是const?

  5. 5

    在Integer上进行同步时,为什么notifyAll()引发IllegalMonitorStateException?

  6. 6

    同步局部变量

  7. 7

    局部变量同步

  8. 8

    局部变量同步

  9. 9

    为什么要在C中重新加载静态局部变量?

  10. 10

    函数的静态局部变量对象在哪里定义?

  11. 11

    如果多个线程使用公共方法读取特定键的值,我们是否需要在私有静态 Map 对象上进行同步?

  12. 12

    局部变量在哪里?

  13. 13

    为什么增强的for循环的局部变量必须是局部的?

  14. 14

    同步于局部变量,比同步方法好吗?

  15. 15

    外部文件中的未定义局部变量(“为什么要对Ruby进行Poignant指南”)

  16. 16

    为什么函数无法访问外部声明的对象中的局部变量

  17. 17

    为什么要使用HttpClient进行同步连接

  18. 18

    为什么通过HttpWebRequest使用HttpClient进行同步请求

  19. 19

    是否有必要在列表上进行同步,而仅在进行删除操作时才可以访问该列表

  20. 20

    为什么在case语句中变量不是局部变量?

  21. 21

    为什么要在小对象上同步?

  22. 22

    在类对象上进行同步会阻塞整个类(及其成员)

  23. 23

    应该在列表本身还是在锁对象上进行同步?

  24. 24

    从密钥中删除对象后,是否需要在NSUserDefaults中进行同步?

  25. 25

    什么是内存模型中的局部变量和对象?

  26. 26

    为什么局部变量不超出范围?

  27. 27

    为什么局部变量在Java中是线程安全的

  28. 28

    为什么局部变量会在Python中循环

  29. 29

    为什么在HashMap.keySet声明局部变量KS()?

热门标签

归档