【问题标题】:Java - Will synchronize on a function block access to instance properties?Java - 将在功能块上同步对实例属性的访问?
【发布时间】:2020-06-25 19:10:02
【问题描述】:

如果我有

class A {
    public int a;
    public synchronized void myMethod() {
       Thread.sleep(1000) 
    }
}

如果一个线程正在运行myMethoda 属性是否会被阻止访问和修改该 A 实例上的其他线程?

【问题讨论】:

  • 仅当您将a 设为私有并限制a 访问同步的getter/setter 方法时。

标签: java multithreading synchronization thread-safety synchronized


【解决方案1】:

简洁地回答您的问题:不,它不会阻止其他线程访问/修改属性。

详细回答:synchronized 是 Java 线程机制的关键部分。这就是线程相互等待的方式。您还应该看到 Object.wait 和 Object.notify/.notifyAll 。同步是线程执行控制,不是数据泄露。

【讨论】:

  • 是的,我自己搞糊涂了,我以为同步锁定了整个实例,但它只锁定同步的方法,即使它们不一样。
  • Re,“synchronized...是线程相互等待的方式。” IMO 具有误导性。我已经看到很多新手提出的问题,他们试图使用synchronizedReentrantLock,而他们本应使用wait()notify() 或一些更高级别的同步对象。我想说,synchronized 是线程如何保持相互隔离的方式。 wait()notify() 以及建立在 wait()notify() 之上的更高级别的东西是线程相互协作的方式。
  • @SolomonSlow 我明白你的意思,我同意你的观点,尽管我更喜欢“......更准确地描述为......”而不是“误导”......除非你认为我正在尝试在 SO 上误导人们 :)
  • 好的,这很公平。 IMO,synchronized 可以更准确地描述为...(我在上面说的)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
  • 2018-05-27
相关资源
最近更新 更多