我一直在网上搜索这个,但找不到任何接近这个的文章,我对此感到非常惊讶。也许智慧隐藏在我尚未找到的某个地方。
假设我有一个包含 10 个不同类型成员的类(为了简单起见,假设它们混合了整数和字符串),并且每个成员都有自己的访问器方法。现在,我想让这个类线程安全。但是,其中一些数据成员不一定会相互交互。例如Person
下面的类,具有age
andname
和其他属性。
public class Person {
private volatile int age;
private String name;
private volatile long blabla;
// ... and so on
public synchronized int getAge() {
return age;
}
public synchronized void setAge(int age) {
this.age = age;
}
// .. and so on for each data member
}
一个线程可能只需要读/写age
,其他线程只需要修改name
。显然,添加synchronized
到每个访问器方法是一个坏主意,因为它锁定了对象的整个实例。一个正在调用的线程getAge()
必须等待另一个正在调用的线程,尽管getName()
它们是两个单独的字段。age
name
因此,一个明显的解决方案是为每个字段创建一个锁(或添加volatile
到原始类型)。然而,这似乎是矫枉过正。如果我有 10 个数据成员,我还需要 10 个锁吗?我想知道是否有另一种方法可以在不过度锁定的情况下实现这一目标。