0

对于以下示例:

public Car getCar(int id){
    Car result= findCarInCache(id);
    if (result==null){
       // POINT A 
       return createCarWithId(id);
    } else {
        return result;
    }
}

public Car findCarInCache(int id){
    // Do something for find a car with this id in the cache
}

public void addToCache(Car car){
    // Add the car to the cache
}

public Car createCarWithId(int id){
    Thread.sleep(10000);
    Car result= new Car(id);
    addToCache(Car);
    return result;
}

例如,当两个线程同时调用 getCar(2) 时,就会出现问题。然后两个线程都到达 POINT A,并生成 Car#2 的两个实例。如何让第二个线程在 POINT A 处等待,直到第一个线程完成创建,然后在两个调用中返回相同的对象?(我在 Android 中这样做)

谢谢

4

1 回答 1

6

正确的方法是在synchronized某处添加一个部分,以确保只有一个线程可以同时进入块。

您专门询问过,POINT A以便您可以createCarWithId同步。

public synchronized Car createCarWithId(int id){

这将锁定this拥有该方法的对象。synchronized这是有关方法的一些文档。

但是,您需要保护添加Car到缓存在缓存中找到它,因为多个线程将同时使用缓存。因此,您还需要制作findCarInCache synchronized. 此外,由于您不想锁定两次getCar,它也应该是synchronized

public synchronized Car getCar(int id){
...
public synchronized Car findCarInCache(int id){
...
public synchronized Car createCarWithId(int id){

如果你想减少你的锁的范围,你可以创建一个锁对象,你可以synchronize

private final Object lockObject = new Object();
...

public Car getCar(int id){
   synchronized (lock) {
      ...
   }
}
public Car findCarInCache(int id){
   synchronized (lock) {
      ...
   }
}
public Car createCarWithId(int id){
   synchronized (lock) {
      ...
   }
}

这是有关锁定对象的更多文档。

于 2012-04-30T16:08:38.677 回答