gpt4 book ai didi

java - 多线程和共享对象

转载 作者:行者123 更新时间:2023-12-01 14:52:05 24 4
gpt4 key购买 nike

如果我有这样的类(class):

class MultiThreadEg {

private Member member;

public Integer aMethod() {
..............
..............
}

public String aThread() {
...............
member.memberMethod(.....);
Payment py = member.payment();
py.processPayment();
...........................
}

}

假设aThread()是一个新线程,那么,太多线程同时访问共享member对象会导致任何问题(如下所示)访问规则)?

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() 中),也会通过太多线程访问 member 对象同时会造成一些差异。

事实是什么?此实现在每种情况下(0 个或多个并发访问)都可靠吗?请指教。谢谢。

最佳答案

您可以简单地使用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 block 开始之前lock(),以保证在开始之前就已获得锁。并且,将 unlock() 放在 finally 子句中可以保证,无论 try 中发生什么(早期返回,)都会抛出异常等),锁将被释放。

关于java - 多线程和共享对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14745903/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com