这里的问题是:“对于线程安全选择来说,这些选择中的哪一个将具有最好的性能?”
public static List<Lock> lockList = initializeLocks();
public boolean bookSeat(int seatNumber, int customerID){
lockList.get(seatNumber).lock();
try{
Seat seat = listOfSeats.get(seatNumber);
if(seat.isAvailable()){
seat.setCustomer(customerID);
return true;
} else { return false; }
} // end try
finally { lockList.get(seatNumber).unlock(); }
}vs
private static List<ReadWriteLock> lockList = initializeLocks();
public boolean bookSeat(int seatNumber, int customerID){
lockList.get(seatNUmber).writeLock().lock;
try{
Seat seat = listOfSeats.get(seatNumber);
if(seat.isAvailable()){
seat.setCustomer(customerID);
return true;
} else { return false; }
} // end try
finally { lockList.get(seatNumber).writeLock().unlock; }
}非常感谢你们!据我所知,这两种方法都有效,但很明显,从我在学校从我的教授那里收集的信息来看,第二种选择是正确的,我不明白为什么一种比另一种更好。希望你们能帮上忙!谢谢!
发布于 2016-04-07 18:54:52
第一个只使用普通锁,第二个使用写锁。
普通锁-独占
一旦你有了锁,其他线程就不能再抢占另一个锁了。因此,这本质上是一个排它锁。
写锁定-写操作独占
一旦你有了一个写锁,没有其他线程可以获取另一个Write锁,但是它们可以获取一个Read锁。
读锁定-与写锁定协同操作
一旦你有了读锁,其他线程就可以获取读锁。但是,在进行读锁定时,不能进行写锁定。
本质上,在读和写锁之间,你可以在写的时候安排独占访问,但如果每个人都在读,那就是自由的。
对于线程安全的选择来说,这些选择中的哪一个会有最好的性能?
通常,如果您正在进行读写操作,使用读/写锁定会获得更好的性能。普通锁阻止所有访问。
发布于 2016-04-07 18:47:58
第二种方法锁定资源,仅用于写入,而不用于读取。两个操作的第一个方法都锁定。
因此,第二个锁允许另一个进程读取资源,而第一个不允许。虽然,first是一个更昂贵的操作。
你可以在官方文档中看到类似这样的东西:https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReadWriteLock.html#writeLock()
https://stackoverflow.com/questions/36473569
复制相似问题