我正在使用下面的代码来阻止并发访问Auction对象。它从哈希图获取对象,因此可以在各种不同的拍卖中进行操作。
我使用了一个同步块,并引用了作为参数选择的单个Auction对象。我的印象是,它持有对象监视器的锁定,并且将使用相同的拍卖(直到第一种情况完成)来阻止对线程的访问。
任何人都可以确认此代码的行为方式是:1)如果两个线程都引用了拍卖A,那么在时间上只能进行一个2)如果一个线程引用了拍卖A而另一个引用了拍卖B,则它们都在获取时继续进行不同的锁。
//Get auction from hashmap
Auction biddingAuction = (Auction) auctions.get(ID);
//Check that auction is active
if(biddingAuction != null)
{
//Acquire lock on Auction object
synchronized(biddingAuction) {
//Some code that alters values of Auction
}
} else {
return "\nBid failed - no auction with an ID of " + ID + " was found\n";
}
任何清晰度都将不胜感激,谢谢
答案 0 :(得分:1)
任何人都可以确认此代码的行为方式是:1)如果两个线程都引用拍卖A,那么一次只能进行一个操作
不。这两个线程都必须在拍卖中同步才能获得该保证。如果一个线程不同步,则即使另一个线程保持锁定,它也可以访问拍卖。
这就是为什么这种方法非常脆弱的原因:如果您在访问Auction的可变共享状态(无论是写入还是读取)之前忘记进行同步,则您的代码不是线程安全的。一种更简洁的方法是通过正确同步访问其共享可变状态的方法,使Auction类本身具有线程安全性。
如果一个线程引用拍卖A和另一个拍卖B,那么它们都将在获取不同的锁时继续进行。
是的。没错。