多线程和共享对象

时间:2013-02-07 07:32:10

标签: java multithreading java-ee shared-memory

如果我有一个类:

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

2 个答案:

答案 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对象时,可能会丢失更新。