首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java锁< this?>出了什么问题

Java锁< this?>出了什么问题
EN

Stack Overflow用户
提问于 2016-04-07 18:32:47
回答 2查看 34关注 0票数 0

这里的问题是:“对于线程安全选择来说,这些选择中的哪一个将具有最好的性能?”

代码语言:javascript
复制
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

代码语言:javascript
复制
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; }
}

非常感谢你们!据我所知,这两种方法都有效,但很明显,从我在学校从我的教授那里收集的信息来看,第二种选择是正确的,我不明白为什么一种比另一种更好。希望你们能帮上忙!谢谢!

EN

回答 2

Stack Overflow用户

发布于 2016-04-07 18:54:52

第一个只使用普通锁,第二个使用写锁。

普通锁-独占

一旦你有了锁,其他线程就不能再抢占另一个锁了。因此,这本质上是一个排它锁。

写锁定-写操作独占

一旦你有了一个写锁,没有其他线程可以获取另一个Write锁,但是它们可以获取一个Read锁。

读锁定-与写锁定协同操作

一旦你有了读锁,其他线程就可以获取读锁。但是,在进行读锁定时,不能进行写锁定。

本质上,在读和写锁之间,你可以在写的时候安排独占访问,但如果每个人都在读,那就是自由的。

对于线程安全的选择来说,这些选择中的哪一个会有最好的性能?

通常,如果您正在进行读写操作,使用读/写锁定会获得更好的性能。普通锁阻止所有访问。

票数 1
EN

Stack Overflow用户

发布于 2016-04-07 18:47:58

第二种方法锁定资源,仅用于写入,而不用于读取。两个操作的第一个方法都锁定。

因此,第二个锁允许另一个进程读取资源,而第一个不允许。虽然,first是一个更昂贵的操作。

你可以在官方文档中看到类似这样的东西:https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReadWriteLock.html#writeLock()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36473569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档