使用特定对象参考的Java同步块

时间:2018-11-11 16:29:44

标签: java concurrency reference synchronized

我正在使用下面的代码来阻止并发访问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";
    }

任何清晰度都将不胜感激,谢谢

1 个答案:

答案 0 :(得分:1)

  

任何人都可以确认此代码的行为方式是:1)如果两个线程都引用拍卖A,那么一次只能进行一个操作

不。这两个线程都必须在拍卖中同步才能获得该保证。如果一个线程不同步,则即使另一个线程保持锁定,它也可以访问拍卖。

这就是为什么这种方法非常脆弱的原因:如果您在访问Auction的可变共享状态(无论是写入还是读取)之前忘记进行同步,则您的代码不是线程安全的。一种更简洁的方法是通过正确同步访问其共享可变状态的方法,使Auction类本身具有线程安全性。

  

如果一个线程引用拍卖A和另一个拍卖B,那么它们都将在获取不同的锁时继续进行。

是的。没错。