如果我有一个类:
class MultiThreadEg {
private Member member;
public Integer aMethod() {
..............
..............
}
public String aThread() {
...............
member.memberMethod(.....);
Payment py = member.payment();
py.processPayment();
...........................
}
}
假设 aThread()是一个新线程,那么,同时由太多线程访问共享成员对象会导致任何问题(具有以下内容)访问规则)?
Rule 1 : ONLY reading, no writing to the object(member).
Rule 2 : For all the objects that need some manipulation(writing/modification), a copy of the original object will be created.
例如:在 payment()方法中,我执行此操作:
public class Member {
private Payment memPay;
public payment() {
Payment py = new Payment(this.memPay);//Class's Object copy constructor will be called.
return py;
}
}
我担心的是,即使我为"写"创建了对象副本。 (如方法 payment()),同时通过太多线程访问成员对象会导致一些差异。
事实是什么?这种实现在每种情况下都是可靠的(0次或多次并发访问)吗?请指教。感谢。
答案 0 :(得分:1)
您只需使用ReentrantReadWriteLock即可。这样,您可以同时读取多个线程,没有问题,但只允许一个线程修改数据。 Java为您处理并发性。
ReadWriteLock rwl = new ReentrantReadWriteLock();
Lock readLock = rwl.readLock;
Lock writeLock = rwl.writeLock;
public void read() {
rwl.readLock.lock();
try {
// Read as much as you want.
} finally {
rwl.readlock.unlock();
}
}
public void writeSomething() {
rwl.writeLock.lock();
try {
// Modify anything you want
} finally {
rwl.writeLock.unlock();
}
}
请注意,在try块开始之前你应该 lock(),以保证在开始之前已经获得锁定。并且,将 unlock()放在 finally 子句中可以保证,无论try中发生什么(早期的返回,都会抛出异常等等),锁将被释放。
答案 1 :(得分:0)
如果更新到memPay取决于memPay内容(如memPay.amount + = 100),您应该在更新时阻止其他线程的访问。这看起来像:
mutual exclusion block start
get copy
update copy
publish copy
mutual exclusion block end
否则,当两个线程同时开始更新memPay对象时,可能会丢失更新。