0

如果我有这样的课程:

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 个或多个并发访问)?请指教。谢谢。

4

2 回答 2

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 中发生什么(提前返回、抛出异常等),锁都会被释放。

于 2013-02-07T07:55:51.123 回答
0

如果对 memPay 的更新取决于 memPay 内容(如 memPay.amount+=100),您应该在更新时阻止其他线程的访问。这看起来像:

mutual exclusion block start
get copy
update copy
publish copy
mutual exclusion block end

否则,当两个线程同时开始更新 memPay 对象时,可能会丢失更新。

于 2013-02-07T07:38:09.180 回答