如果一个对象中有几个可变属性将由多个线程执行,我明白它们应该被同步.
class Doggie { private String name; private int age; public void setName(String name) { this.name = name; } public String getName() { return this.name; } public void setAge(int age) { this.age = age; } public int getAge() { return this.age; } }
问题:
> Java中没有返回和赋值原子操作?
>由于属性可能不一定相互关联,与同一个锁同步并不总是有意义的.如何组织锁定结构?
>内在的锁或私有的对象锁定模式是否更好?
解决方法
- Are not return and assignment atomic operations in Java?
是的,他们是原子的(在某些情况下至少),但原子性不是唯一的问题.另一个重要的问题是,一个线程对一个属性的写入操作是否被保证对于不同线程所做的相同属性的后续读取是可见的.
>当读取和写入在同一个线程中时,读取将保证看到较早的写入.
>当读取和写入在不同的线程中时,读取只能保证看到较早的写入,如果两个线程正确同步…或者该属性被声明为volatile.
请注意,原始锁/互斥体不是唯一的同步方式.
- Since properties might not necessarily be interrelated,it does not always make sense to synchronize with the same lock. How to organize the locking structure?
如果(且只有)锁争用可能,则使用多个锁是有道理的.在您的示例中,如果某些Doggie实例收到非常高的获取和/或设置操作的速率,则锁争用仅可能是一个问题.
- Is it better to go with the intrinsic lock or a private Object lock pattern?
这取决于.如果您的应用程序正在使用Doggie对象的原始锁定,那么您可能会遇到锁定争用或甚至意外锁定get和set操作.在这种情况下,私人锁可能是可取的.否则,私有锁是不必要的开销.