如果正在运行的线程访问某个特定对象,那么它还会锁定该特定对象的字段成员吗?
答案 0 :(得分:5)
您是否明确锁定了对象?您使用的是synchronized
吗?
对某个对象进行锁定并不意味着锁定其成员。
答案 1 :(得分:1)
同步是围绕称为内部锁或监视器锁的内部实体构建的。 (API规范通常将此实体简称为“监视器”。)内部锁在同步的两个方面都发挥作用:强制对对象状态进行独占访问,并建立对可见性至关重要的先发生关系。
答案 2 :(得分:1)
锁只是一个锁,它唯一保证的是一次只有一个线程可以拥有它。您可以编写代码来确保您想要锁定的内容实际上已被锁定。
所以如果你写:
class MyClass {
private int myvalue;
public synchronized void setValue(int newvalue) {
myvalue = newvalue;
}
}
然后确保只有一个线程可以写入myvalue。但是,如果您要将myvalue公开或提供另一种写入方式,那么没有什么能阻止其他线程同时写入myvalue。编码逻辑取决于你。
答案 3 :(得分:0)
如果你锁定了有问题的对象,那么另一个线程显然无法获得锁定,但这并不会限制字段成员被更改或修改。