【问题标题】:How Class level Synchronization implement in Java?Java中如何实现类级同步?
【发布时间】:2017-01-20 11:00:16
【问题描述】:

我有一个具有某种状态的类的对象。 这个对象有两个方法(method1()method2()),都在改变obj的状态。 method1() 已同步,但 method2() 未同步。

现在有两个线程,thread1 和 threads2 接近对象 ->threads1 调用同步的method1() -> thread2 调用了不同步的method2()

我在测试结果中发现method2() 执行正确,即使method1() 持有锁。但是我想如果通过在方法上加上同步关键字来获得整个对象的锁,那么可以执行多少另一个方法。它应该等待。

非常感谢您的意见。

【问题讨论】:

  • 你想错了。由于method2 没有同步,它不会尝试获取锁,如果锁已经被method1 获取,则会阻塞。
  • 一些代码会很好。
  • @Kayman 我刚刚发现它现在对我有用。谢谢

标签: java multithreading thread-safety synchronized


【解决方案1】:

当我们说调用同步方法或块导致锁定时,这意味着线程独占获取锁定。这并不意味着线程获得锁的对象的状态得到任何其他保护。

(为了方便语言设计者,将内在锁附加到对象(包括类对象)。这个决定可能不是最好的决定。使用专用对象锁定通常是一个更好的主意。)

您的未同步调用可能会破坏共享状态。除此之外,没有设置内存屏障,其他线程可能看不到调用非同步方法的线程所做的更改。 JIT 在进行诸如重新排序代码之类的优化时不会考虑跨线程可见性问题。

很难预测在未充分同步的代码中会发生什么。

【讨论】:

    【解决方案2】:

    但我认为,如果通过在方法上设置同步来获取整个对象的锁,则可以执行任何其他方法。它应该等待。

    锁不知道它锁的是什么。它只是阻止其他线程获取相同的锁。

    【讨论】:

      【解决方案3】:

      这里有一些不错的答案,但我认为需要更详细一些。

      从我的测试结果中发现,即使 method1() 有锁,method2() 也能正常执行。

      当线程进入synchronized 方法时,它会锁定与对象实例关联的监视器。其他线程可以随意调用同一对象实例上的其他非同步方法。 thread1 持有的锁不会以任何方式改变obj。只有thread2 also 去锁定 same 对象实例才会被阻止。

      但我认为,如果通过在方法上设置同步来获取整个对象的锁,则可以执行任何其他方法。它应该等待。

      不,事实并非如此。如果每个方法调用都必须查看其方法被调用的对象上是否存在锁,则会对性能造成很大影响。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-18
        • 1970-01-01
        • 2017-12-08
        • 2010-09-15
        • 2013-06-18
        相关资源
        最近更新 更多