对不起,这可能是一个非常愚蠢的问题,但是....我正在进行模拟,客户进入商店,然后经过该商店,然后过了一段时间,被放入结账数组列表(其中有许多列表可能会输入,由addCustomer决定)。我已经为每个客户提供了线程,而我遇到的问题是这个addCustomer方法的锁定导致了大量的积压,如果运行时间过长会导致模拟崩溃。有更简单的方法(即限制客户或减慢他们的睡眠速度)但我想知道是否可以为同一方法创建多个锁,以便如果一个客户在一个锁下输入方法,另一个可以输入在不同的锁定下。或者这是否会有效地破坏锁定点并允许计算机在不同时间混合客户的错误?以下是相关代码,如果我错过了一些关键部分,请告诉我.....
这是方法。
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();
}
}
这是runnable的相关部分。
public void run() {
try {
customer.addRandomShopTime();
while (customer.shopTime > 0) {
Thread.sleep(5);
customer.setShopTime();
}
CheckoutOperator checkoutOperator = checkoutFloor.weightedCheckoutDeterminator();
checkoutOperator.addCustomer(customer);
任何建议将不胜感激!对不起以前从未做过多线程,所以这对我来说都是新手。
答案 0 :(得分:0)
需要锁定以避免两个或多个线程同时访问costumerList
,因此允许多个线程进入关键部分并不是一个好主意......
除了会造成额外的问题,为什么两把锁会解决原来的问题呢?积压会缩短吗?似乎真正的原因是从列表中删除客户的速度要慢得多。
答案 1 :(得分:0)
每个客户都创建一个CustomerContainer子类的实例,该子类接收自己的Lock对象。 考虑制作一个最终的静态Lock,它应该保护您希望同时访问的资源,在您的情况下是customerList。
您现在拥有的是每个客户实例的一个锁,因为每个客户都创建了CustomerContainer子类,而您的锁不是静态的。 除非您确实需要可重入锁定功能,否则请考虑关键字同步。 每个资源拥有多个锁定会抵消锁定点。