抱歉,这可能是一个非常愚蠢的问题,但是......我正在进行模拟,客户进入一家商店,并穿过该商店,然后在一段时间后,被放入结账数组列表中(其中有许多可能进入的列表,这是由 addCustomer 确定的)。我已经对每个客户进行了线程处理,我遇到的问题是此 addCustomer 方法的锁定导致大量积压,如果运行时间太长,则会导致模拟崩溃。有更简单的方法可以解决这个问题(即限制客户或通过 sleep 减慢他们的速度),但我想知道是否可以为同一方法创建多个锁,这样如果一个客户在一个锁下进入该方法,另一个客户就可以进入在不同的锁下。或者这会有效地破坏锁点并允许计算机在不同时间混淆客户而出现错误吗?这是相关代码,如果我错过了一些关键部分,请告诉我......
方法如下。
public abstract class CustomerContainer {
ArrayList<Customer> customerList = new ArrayList<Customer>();
private Condition containerCondition;
private Lock containerLock;
int counter = 0;
public CustomerContainer() {
containerLock = new ReentrantLock();
containerCondition = containerLock.newCondition();
}
public void addCustomer(Customer newCustomer) {
containerLock.lock();
try {
customerList.add(newCustomer);
System.out.println("no. of customers" + counter);
counter++;
} finally {
containerLock.unlock();
}
}
这是可运行的相关部分。
public void run() {
try {
customer.addRandomShopTime();
while (customer.shopTime > 0) {
Thread.sleep(5);
customer.setShopTime();
}
CheckoutOperator checkoutOperator = checkoutFloor.weightedCheckoutDeterminator();
checkoutOperator.addCustomer(customer);
如有任何建议,我们将不胜感激!抱歉,以前从未做过多线程,所以这对我来说是全新的。
最佳答案
每个客户都会创建一个 CustomerContainer 子类的实例,该实例接收自己的 Lock 对象。 考虑制作一个最终的静态锁,它应该保护您希望同时访问的资源(在您的情况下为 customerList)。
您现在拥有的是每个客户实例一个锁,因为每个客户都会创建 CustomerContainer 子类,并且您的锁不是静态的。 除非您确实需要可重入锁定功能,还请考虑关键字synchronized。 每个资源拥有多个锁会否定锁点。
关于java - 一种方法的多个锁 - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23922300/